7

誰かが私にこれを説明できますか?

$ set -x
$ export X="--vendor Bleep\ Bloop"; echo $X
+ export 'X=--vendor Bleep\ Bloop'
+ X='--vendor Bleep\ Bloop'
+ echo --vendor 'Bleep\' Bloop
--vendor Bleep\ Bloop
$

特に、要求していない文字がecho行に挿入されるの'はなぜですか? また、文字列が終了していないように見えるのはなぜですか?

4

5 に答える 5

4

シェル拡張について

Bash は、設定された順序でシェル展開を実行します。-x フラグを使用すると、入力行を構成する単語をトークン化して展開するときに Bash が実行する手順の中間結果を確認できます。

つまり、出力は設計どおりに動作しています。トークン化、単語分割、または拡張をデバッグしようとしている場合を除き、中間結果はそれほど重要ではありません。

于 2013-01-08T18:00:09.430 に答える
2

(良い質問)

' 文字は実際には存在しません。

-x文字列をそのまま維持しながら、機能がどのように処理されているかを明確にしようとしているときに表示されるものについて説明します。別の+行の先頭にある記号は、echoこれがシェルのデバッグ/トレース出力であることを示しています。

最終的な出力は、割り当てとまったく同じであることに注意してください。X=...

IHTH

于 2013-01-08T17:25:26.027 に答える
1

このコード

echo --vendor 'Bleep\' Bloop

とまったく同じ出力を生成します

echo "--vendor Bleep\ Bloop"

Bash は、デバッグ/トレース オプションを使用して、コードを独自のコードに再解釈するだけです。この理由はおそらく歴史的なものであり、気にする必要はありません。

于 2013-01-08T17:53:56.723 に答える
1

あなたの混乱は、このことからさらに生じているよう+ echo --vendor 'Bleep\' Bloopです。そのように見えるのは、展開したときにどのように見えるかを印刷しているためXです。言い換えれば、実行$Xは独立した「単語」、、、およびをコマンドラインに置くことと評価さ--vendorBleep\ますBloop。ただし、これは が単語であることを意味し、が(スペース)をエスケープするように解釈されるBloop\のを防ぐために、を保持しています。これらが別のコマンドへのパラメーターであることが意図されている場合は、次のいずれかを実行することをお勧めします。\\

export X='--vendor "Bleep Bloop"'

また

export X="--vendor \"Bleep Bloop\""

しかし、どちらかが機能するかどうかは100%わかりません。コマンドにパラメーターを保存する場合は、次のようにします。

# optional:
# declare -a ARGS
ARGS=('--vendor' '"Bleep Bloop"')

そして、それらを次のように使用します。

echo ${ARGS[@]}
于 2013-01-08T17:35:29.547 に答える
0

set -x入力したすべてのコマンドの解釈を出力するように Bash に指示している場合。

なので入れるときは

export X="--vendor Bleep\ Bloop"

バッシュはそれを次のように見ています

export 'X=--vendor Bleep\ Bloop'

とそのように印刷します。

于 2013-01-08T17:23:08.960 に答える