`printf - "#!${opt_E}"`コマンドの解釈

`printf - "#!${opt_E}"`コマンドの解釈

このコマンドを理解できず、混乱しています。どのように動作するかを理解するために、Linuxで行ったことは次のとおりです。

[root@testgfs2 final_scripts]# printf -- "#!${opt_E}"
printf -- "#reset{opt_E}"
#reset{opt_E}[root@testgfs2 final_scripts]# printf -- "#!${opt_E}"
printf -- "#"#reset{opt_E}"{opt_E}"
##reset{opt_E}{opt_E}[root@testgfs2 final_scripts]# echo !$
echo "#"#reset{opt_E}"{opt_E}"
##reset{opt_E}{opt_E}

これがどのように機能するのか、どのテーマに表示されるのかわからないため、Googleでも見つかりません。

--printfの後に何をすべきですか?

答え1

バラよりバッシュリファレンスマニュアル:

! ! :$

前のコマンドの最後のパラメーターを指定します。これは!$に省略できます。

不快な行動なら逃げてもいいです!バックスラッシュの使用:

% echo "\!$"                  
!$

答え2

劇中キャラクターは#!このような状況では特別ではない。このコードスニペットは、2つのパラメータを使用してコマンドをprintf -- "#!${opt_E}"呼び出します。、および変数値に関連付けられています。このパラメータは、後で始まるパラメータがあってもオプションとして解釈されないことを示します。で始まらないからです。二重引用符は、コメントの先頭文字が解釈されるのを防ぎ、値がワイルドカードパターンとして解釈される別の単語に分割されるのを防ぎます。printf--#!opt_E--printf-#!${opt_E}-#!${opt_E}#opt_E

値にまたは文字がopt_E含まれていない場合、このコマンドは末尾に改行文字なしで次の値を印刷します。通常、このコマンドは値をprintf形式として解釈します。%\#!opt_Eopt_E

対話型シェルでこれを試みると、以前のコマンドを!自動的に呼び出す履歴拡張文字として解釈されるという点で、奇妙な効果を見ることができます。これを防ぐために、一重引用符で文字通り解釈する\前に。を追加してください!!printf -- '#!${opt_E}'

スクリプトを再生するには、opt_Eまず正しい値を設定する必要があります。スクリプトをデバッグする場合は、set -x2行目を追加します(最初の行のすぐ下に挿入#!)。シェルは実行時に各行のトレース情報を出力します。

関連情報