私第三者次の形式でコマンドライン引数を受け取るスクリプト:
$ ./script.sh --params a=123 b=456
次の内容を含むxyz.txtファイルがあります。
c=3
d=4
その内容をスクリプトの引数として使用しようとしていますが、スクリプトが正しい引数を受け取っていないと文句を言います。これにより、set -x
各パラメータが一重引用符で囲まれていることがわかります(したがって、サードパーティのスクリプトはそれを処理できません)。
$ set -x
$ ./script.sh --params $(cat xyz.txt)
....
+-zsh:20> cat xyz.txt
+-zsh:20> ./script.sh --params 'c=3' 'd=4'
bashで(また使用してset -x
)結果は期待どおりです(シングルクォートを除く)。
$ set -x
$ ./script.sh --params $(cat xyz.txt)
++ cat xyz.txt
+ ./script.sh --params c=3 d=4
ファイルの値に等号が含まれていない場合、この問題は発生しません。例えば
e-5
f-6
...
+-zsh:20> ./script.sh --params e-5 f-6
できるだけ多くの機能を無効にしようとしましたが、setopt
成功しませんでした。
Zshに等号(Bashアクションの模倣)が含まれている場合、私の引数を一重引用符で囲むのを防ぐにはどうすればよいですか?
答え1
シェルはパラメータに一重引用符を挿入しません。
証明する:
$ cat file
c=3
d=4
$ printf 'Argument: >>%s<<\n' $(cat file)
Argument: >>c=3<<
Argument: >>d=4<<
これは、読み取った2行がfile
2つの別々のパラメータに正しく分割され、単一printf
引用符を追加せずにユーティリティに渡されたことを示しています。
以下を実行しても出力は変わりませんset -x
。
$ set -x
$ printf 'Argument: >>%s<<\n' $(cat file)
+/usr/local/bin/zsh:11> cat file
+/usr/local/bin/zsh:11> printf 'Argument: >>%s<<\n' 'c=3' 'd=4'
Argument: >>c=3<<
Argument: >>d=4<<
一重引用符は、スクリプトに渡されるパラメーターの一部ではありません。これは単にトレース出力用の視覚補助ツールとしてシェルによって挿入されます(これはデバッグ出力であり、シェルへの入力として使用または解釈することはできません)。シェルzsh
のbash
トレース出力形式とは若干異なります。それがすべてです。
シェルでスクリプトを実行できない場合は、シェルがファイル内zsh
のデータを修正して問題が発生したわけではありません。