zsh トレースで予期しない引用符

zsh トレースで予期しない引用符

第三者次の形式でコマンドライン引数を受け取るスクリプト:

$ ./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行がfile2つの別々のパラメータに正しく分割され、単一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<<

一重引用符は、スクリプトに渡されるパラメーターの一部ではありません。これは単にトレース出力用の視覚補助ツールとしてシェルによって挿入されます(これはデバッグ出力であり、シェルへの入力として使用または解釈することはできません)。シェルzshbashトレース出力形式とは若干異なります。それがすべてです。

シェルでスクリプトを実行できない場合は、シェルがファイル内zshのデータを修正して問題が発生したわけではありません。

関連情報