私の場合.bashrc
、後でコマンド ラインで使用できる関数を定義します。
function mycommand() {
ssh [email protected] cd testdir;./test.sh "$1"
}
このコマンドを使用すると、cd
リモート ホストではコマンドのみが実行されます。test.sh
コマンドはローカル ホストで実行されます。これは、セミコロンがコマンドssh
とtest.sh
コマンドの 2 つの異なるコマンドを区切っているためです。
関数を次のように定義してみました (一重引用符に注意してください)。
function mycommand() {
ssh [email protected] 'cd testdir;./test.sh "$1"'
}
cd
コマンドとコマンドを一緒に保持しようとしましたが、関数に何を渡すかに関係なく、test.sh
引数は解決されません。常にコマンドを実行しようとします$1
./test.sh $1
リモートホスト上。
に与えられた引数を に渡す機能を使用して、ディレクトリ に変更した後にリモート ホスト上でmycommand
スクリプトが実行されるように を適切に定義するにはどうすればよいでしょうか。test.sh
testdir
mycommand
test.sh
ベストアンサー1
代わりに次のようにしてください:
function mycommand {
ssh [email protected] "cd testdir;./test.sh \"$1\""
}
コマンド全体を単一の文字列として渡す必要がありますが、その単一の文字列は$1
ssh に送信する前に展開する必要があるため、""
を使用する必要があります。
アップデート
実際にこれを行う別の適切な方法は、printf %q
引数を適切に引用符で囲むために を使用することです。これにより、引数にスペース、一重引用符、二重引用符、またはシェルに特別な意味を持つ可能性のあるその他の文字が含まれていても、引数を安全に解析できるようになります。
function mycommand {
printf -v __ %q "$1"
ssh [email protected] "cd testdir;./test.sh $__"
}
- 関数を宣言する場合
function
、()
は必要ありません。 - POSIX 主義者だからといって、それについてコメントしないでください。
Bash バージョン 4.4 以降では、次のように簡略化することもできます。
function mycommand {
ssh [email protected] "cd testdir;./test.sh ${1@Q}"
}
${parameter@operator}
のセクションを参照シェルパラメータの拡張。