まず、リモートデスクトップに接続してからリモートデスクトップのコマンドラインに接続するときに2番目の引数を使用したいとしますbash function
。これが一重引用符を使用する理由です。しかし、この問題をどのように理解するのかわかりません。$2
議論。
my_func () {
ssh blah blah blah $1 'cd $2'
}
2番目のパラメータをどのように指定するのかわかりません。私のローカルコンピュータでこの機能を実行してみました。
my_func a b
ここで、bはリモートデスクトップのディレクトリですが、期待した結果が得られないようです。
答え1
$2
リモートユーザーのログインシェルに適した方法で引用する必要があります。たとえば、Bourneに似ているとします。
shquote() {
LC_ALL=C awk -v q=\' '
BEGIN{
for (i=1; i<ARGC; i++) {
gsub(q, q "\\" q q, ARGV[i])
printf "%s ", q ARGV[i] q
}
print ""
}' "$@"
}
my_func () {
ssh blah blah blah "$1" "cd -- $(shquote "$2")"
}
たとえば、これはBourneに似たリモートシェルでディレクトリ引数を使用して実行されると解釈されるコマンドラインにshquote()
変換されます。Stephane's dir
'Stephane'\''s dir'
cd -- 'Stephane'\''s dir'
cd
Stephane's dir
それにもかかわらず、リモートホストでシェルを実行してもcd
有用な結果は生成されません。
追加の読み取り(およびリモートユーザーのログインシェルがBourneのログインシェルと異なる場合を含む追加オプション):リモートユーザーのログインシェルを知らず、SSHを介して任意の単純なコマンドをどのように実行できますか?
答え2
my_func () {
ssh blah blah blah $1 'cd $2'
}
一重引用符を使用しないでください。 Bash変数は、一重引用符を使用しても拡張されません。試してみるとssh blah blah blah $1 "cd $2"
正常に動作します。一重引用符を二重引用符に変更しても、bashがコマンドの他の項目を拡張しないことを確認してください。そうしないと、予期しない結果が生じる可能性があります。
答え3
何について:
my_func() {
blah blah blah blah $1 "cd \"$2\""
}
これは含まれるパラメータには適用されません"
。