さまざまな位置パラメーターを使用できるスクリプトがあるとし#!/bin/sh
ます。その中には、スペース、どちらか/両方の種類の引用符などが含まれる場合があります。反復"$@"
し、引数ごとに何らかの方法ですぐに処理するか、後で保存します。exec
スクリプトの最後で、(おそらく) 別のプロセスを起動し、これらのパラメーターの一部をすべての特殊文字をそのままにして渡したいと思います。
パラメータを処理していなければothercmd "$@"
問題なく動作しますが、いくつかのパラメータを取り出して少し処理する必要があります。
Bash を仮定できれば、後で使用printf %q
できる引数の引用バージョンを計算するために使用できますeval
が、これはたとえば Ubuntu の Dash ( /bin/sh
) では機能しません。
printf %q
スクリプトにコピーできる関数として、ビルトインおよびPOSIX定義のユーティリティのみを使用して、プレーンなBourneシェルスクリプトで記述できるものと同等のものはありますか?
たとえば、ls
引数を逆の順序で実行しようとするスクリプト:
#!/bin/sh
args=
for arg in "$@"
do
args="'$arg' $args"
done
eval "ls $args"
多くの場合に機能します:
$ ./handle goodbye "cruel world"
ls: cannot access cruel world: No such file or directory
ls: cannot access goodbye: No such file or directory
'
が使用される場合ではありません。
$ ./handle goodbye "cruel'st world"
./handle: 1: eval: Syntax error: Unterminated quoted string
以下は問題なく動作しますが、Bash に依存しています。
#!/bin/bash
args=
for arg in "$@"
do
printf -v argq '%q' "$arg"
args="$argq $args"
done
eval "ls $args"