0

別のBashスクリプトを呼び出すBashスクリプトがあります。呼び出されたスクリプトは、いくつかの変更とチェックを行い、シフトしてから、呼び出し元のコマンドラインの残りの部分を通過させます。

呼び出されたスクリプトで、すべてが管理され、呼び出す準備ができていることを確認しました。これが私が入れたデバッグスタイルのコードです:

echo $SVN $command $@ > /tmp/shimcmd
bash /tmp/shimcmd
$SVN $command $@

これで、/ tmp/shimcmdに次のように表示されます。

svn commit --username=myuser --password=mypass --non-interactive --trust-server-cert -m "Auto Update autocommit Wed Apr 11 17:33:37 CDT 2012"

つまり、ビルドされたコマンドはすべて1行で、-m「スペース付きの文字列」部分を含めて完全に問題ありません。

それは完璧だ。また、「bash / tmp/shimcmd」の実行も完全に機能します。

しかしもちろん、このばかげたtmpファイルなどは必要ありません(デバッグにのみ使用されます)。問題は、shimファイルを介してではなく、コマンドを直接呼び出すことです。

$SVN $command $@

その結果、svnコマンド自体はスペース付きの引用符で囲まれた文字列を受け取りません。「-m」「スペース付きの文字列」パラメータが文字化けし、「-mスペース付きの文字列」として渡されたかのようにコマンドをシャンクします。

私はあらゆる種類のクレイジーな脱出方法を無駄に試しました。これがひどく私を悩ませているなんて信じられない。繰り返しますが、まったく同じもの($ SVN $ command $ @)をファイルにエコーし、そのファイルを実行することで、FINEになります。ただし、直接呼び出すと、引用符で囲まれた文字列が文字化けします。その要素だけがシャンクします。

何か案は?

ダン

4

3 に答える 3

0

問題を示す方法は次のとおりです。

$ args='-m "foo bar"'
$ printf '<%s> ' $args
<-m> <"foo> <bar">

そして、これを回避する方法は次のとおりです。

$ args=( -m "foo bar" )
$ printf '<%s> ' "${args[@]}"
<-m> <foo bar>

この後者の場合、argsは配列であり、引用符で囲まれた文字列ではありません。

ちなみに、この動作を実現する"$@"には、ではなく$@、である必要があることに注意してください(配列エントリの境界を尊重するために文字列の分割を回避します)。

于 2012-04-11T23:26:15.097 に答える
0

試しましたか:

eval "$SVN $command $@"

于 2012-04-11T23:29:06.533 に答える
0

これ

echo -n -e  $SVN \"$command\"  > /tmp/shimcmd
for x in "$@"
  do
     a=$a" "\"$x\"
  done
echo -e " " $a >> /tmp/shimcmd
bash /tmp/shimcmd

または単に

$SVN "$command" "$@"
于 2012-04-11T23:41:35.417 に答える