86

.bashrc後でコマンドラインで使用できる関数を定義します。

function mycommand() {
    ssh user@123.456.789.0 cd testdir;./test.sh "$1"
}

このコマンドを使用すると、cdコマンドだけがリモート ホストで実行されます。test.shコマンドはローカル ホストで実行されます。これは、セミコロンが 2 つの異なるコマンド (sshコマンドとコマンド) を区切るためtest.shです。

次のように関数を定義しようとしました(一重引用符に注意してください):

function mycommand() {
    ssh user@123.456.789.0 'cd testdir;./test.sh "$1"'
}

cdコマンドとコマンドをまとめようとしましたが、関数に与えるものとは関係なくtest.sh、引数が解決されません。$1常にコマンドを実行しようとします

./test.sh $1

リモートホスト上。

に与えられた引数を渡す機能を使用して、ディレクトリに変更した後にmycommandスクリプトtest.shがリモートホストで実行されるように、適切に定義するにはどうすればよいですか?testdirmycommandtest.sh

4

5 に答える 5

107

代わりに次のようにします。

function mycommand {
    ssh user@123.456.789.0 "cd testdir;./test.sh \"$1\""
}

コマンド全体を単一の文字列として渡す必要がありますが、その単一の文字列$1では、ssh に送信する前に展開する必要があるため、使用する必要があります""

アップデート

これを実際に行う別の適切な方法はprintf %q、引数を適切に引用するために使用することです。これにより、スペース、一重引用符、二重引用符、またはシェルにとって特別な意味を持つ可能性のあるその他の文字が含まれていても、引数を安全に解析できます。

function mycommand {
    printf -v __ %q "$1"
    ssh user@123.456.789.0 "cd testdir;./test.sh $__"
}
  • で関数を宣言する場合、,function()必要ありません。
  • あなたが POSIXist であるという理由だけで、それについてコメントしないでください。
于 2013-08-29T05:32:48.637 に答える
6

古いスレッドを復活させますが、このかなりきれいなアプローチはリストされていませんでした.

function mycommand() {
    ssh user@123.456.789.0 <<+
    cd testdir;./test.sh "$1"
+
}
于 2014-12-11T00:59:58.777 に答える