このコマンドを理解できず、混乱しています。どのように動作するかを理解するために、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_E
opt_E
対話型シェルでこれを試みると、以前のコマンドを!
自動的に呼び出す履歴拡張文字として解釈されるという点で、奇妙な効果を見ることができます。これを防ぐために、一重引用符で文字通り解釈する\
前に。を追加してください!
。!
printf -- '#!${opt_E}'
スクリプトを再生するには、opt_E
まず正しい値を設定する必要があります。スクリプトをデバッグする場合は、set -x
2行目を追加します(最初の行のすぐ下に挿入#!
)。シェルは実行時に各行のトレース情報を出力します。