リモート サーバー上で複数単語の引数を持つローカル スクリプトを実行するにはどうすればよいですか?

リモート サーバー上で複数単語の引数を持つローカル スクリプトを実行するにはどうすればよいですか?

test.shローカル マシン上にあるスクリプトをリモート サーバーで実行しようとしています。test.sh多くの場合、複数の単語を含む引数を取ります。

テスト:

#!/bin/bash
while getopts b: opt;
do
  case $opt in
    b)
       bval="$OPTARG"
       ;;
  esac
done
echo $bval

私のローカルマシンでは問題なく動作します:

./test.sh -b "multi word arg"

出力:

multi word arg

しかし、リモート サーバーで実行すると、次のようになります。

ssh -A user@remotehost "bash -s" -- < ./test.sh -b "multi word arg"

私が得るのは:

multi

完全な複数単語の引数をスクリプトに渡す方法について何かアイデアはありますか?

答え1

別のレベルの引用が必要です:'"multi word arg"'

最初のレベルの引用符はローカル シェルによって削除され、sshになりますmulti word arg。次にssh、リモート システム上で、 が次のようなものを実行します$SHELL -c "bash -s -- -b multi word arg"(ここでも$SHELL、ログイン シェルはおそらく bash です)。次に、ログイン シェルは引用符の削除 (削除するものはありません) と単語の分割を実行します。これが 1 つの単語になる理由です。

説明する:

% ssh 192.168.0.2 'printf :%s:\\n' '"foo bar baz"'
:foo bar baz:
% ssh 192.168.0.2 'printf :%s:\\n' 'foo bar baz'
:foo:
:bar:
:baz:

関連情報