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

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

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

最初の項目があり、区切り文字を使用して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

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

答え2

Heredocは再解釈しません。つまり、Heredocは、その中にあるコマンドは実行しないと言うことができます。文字列を挿入するだけです。

したがって、あなたのクエリに対する答えは、-ingがsource区切られたドキュメント内では発生しないことです。

後者の\場合、バックスラッシュを使用して文書を区切って拡張したくない文字の意味をオフにすることができます。

答え3

非常に古いコンテンツであることを知っていますが、検索中に見つけて他の人のために編集したいと思いました。

ここにあるドキュメントでは、逆引用符 ` でコマンド置換を使用するか、通常の $() 表記法を使用できます。したがって、あなたの場合は、$(. ./my_source)を使用してmy_sourceファイルを取得できます。

しかし、あなたの説明によると、実際にはmy_sourceファイルを取得したくないようです。この投稿の私の解釈は、あなたの意図がmy_sourceファイルを実行するのではなく、my_sourceファイルの内容を含むことであり、これによりstdoutがScriptBにマージされる可能性があります。

posix 標準に準拠するには、代わりに cat コマンドを使用します。

#!/bin/sh

logfile=my_logfile
scriptB=my_script
cat > ${scriptB} << __EOF__
  $(cat my_source)  #this is a shell script
  echo "Some text" | tee -a ${logfile}
__EOF__

コマンド置換はサブシェルを生成するので、bashismに問題がない場合は、ファイル全体を変数として読み、通常の引数に拡張するだけです。

#!/bin/bash

logfile=my_logfile
scriptB=my_script
IFS="" read -r -d '' my_source_var < my_source
cat > ${scriptB} << __EOF__
  ${my_source_var}  #this is a shell script
  echo "Some text" | tee -a ${logfile}
__EOF__

関連情報