シェルはこの文書に含まれる内容をどのように拡張しますか?

シェルはこの文書に含まれる内容をどのように拡張しますか?

特定のポイントに関する情報がどこにも見つからなかったため、歪んだシェル論理ケースを送信する必要があります(逃した場合はお詫び申し上げます)。文脈を説明しようとします。

最初の項目があり、区切り文字を使用して2番目の項目を作成しscriptAたいと思います。私はこのheredocにファイルを含めると、いくつかのローカル変数(拡張機能など)のscriptB2つの項目を含めたいと思います。例は次のとおりです。my_sourcescriptAscriptA

スクリプトA:

#!/bin/sh
logfile=/path/to/my_logfile
scriptB=/path/to/my_script
cat > ${scriptB} << __EOF__
  . /path/to/my_source  #this is a shell script
  echo "Some text" | tee -a ${logfile}
__EOF__

上記のコードスニペットに関する私の質問は次のとおりです。.コマンドのシェル拡張(つまり含む)がmy_source内部で発生するのscriptAか、外部から発生しますかscriptB

ボーナス:何とか一部を指定できますか?部分ここで文書を拡張してはいけませんか?

注:ここではPOSIXに準拠し、bashの詳細を避けようとしています。

あなたの洞察力に感謝します!

編集:答えは、.ここのドキュメントでユーティリティを実行してはいけないということですscriptA。ここにあるドキュメントでは、次の作業のみを行うためです。

パラメータ拡張、コマンド置換、算術拡張

これは.拡張なしのシェル専用組み込みユーティリティです(bash、ksh、tcshのみ(...)組み込みを含むすべてのシェル組み込みユーティリティと同じ)。

洞察力をいただいた@ilkkachuに感謝します。

ベストアンサー1

いいえ、ここのドキュメントは大幅に拡張されました。二重引用符で囲まれた文字列と同じです。:

単語の一部が引用されていない場合、ここにある文書のすべての行は、パラメータ拡張、コマンド置換、および算術拡張のために拡張する必要があります。

バックスラッシュを使用して特殊文字をエスケープすることもできます。

引用に関する注意事項は、このような内容のために<<"EOF"ここの文書の内容が拡張されないことを意味します。あなたの例では、${logfile}シェルは入力をに渡す前に参照を拡張しますcat

コマンドの出力を含めたい場合でもコマンド置換を使用できますが、それがすべてであればパイプを使用することも合理的なオプションです。

おすすめ記事