What is a heredoc? Here Documents Explained | Linux Terminal 201 - HakTip 179
目次:
シェルスクリプトを記述するとき、
tee
、
cat
、または
sftp
などの対話型コマンドに複数行のテキストブロックまたはコードを渡す必要がある場合があります。
BashおよびZshなどの他のシェルでは、ヒアドキュメント(Heredoc)は、コマンドに複数行の入力を渡すことができるリダイレクトの一種です。
HereDocを記述する構文は次の形式を取ります。
<< 'DELIMITER' HERE-DOCUMENT DELIMITER
- 最初の行はオプションのコマンドで始まり、特別なリダイレクト演算子
<<
と区切り識別子が続きます。- 区切り識別子として任意の文字列を使用でき、最も一般的に使用されるのはEOFまたはENDです。区切り識別子が引用符で囲まれていない場合、シェルはヒアドキュメントの行をコマンドに渡す前にすべての変数、コマンド、および特殊文字を置き換えます。リダイレクト演算子
<<-
にマイナス記号を<<-
と、すべての先行タブ文字が無視されます。 これにより、シェルスクリプトでヒアドキュメントを記述するときにインデントを使用できます。 先頭の空白文字は許可されず、タブのみが許可されます。
- 区切り識別子として任意の文字列を使用でき、最も一般的に使用されるのはEOFまたはENDです。区切り識別子が引用符で囲まれていない場合、シェルはヒアドキュメントの行をコマンドに渡す前にすべての変数、コマンド、および特殊文字を置き換えます。リダイレクト演算子
基本的なHeredocの例
このセクションでは、heredocの使用方法の基本的な例をいくつか見ていきます。
Heredocは、catコマンドと組み合わせて最もよく使用されます。
次の例では、ヒアドキュメントを使用して、環境変数とコマンドを含む2行のテキストを
cat
渡します。
cat << EOF The current working directory is: $PWD You are logged in as: $(whoami) EOF
以下の出力からわかるように、変数とコマンド出力の両方が置き換えられます。
The current working directory is: /home/linuxize You are logged in as: linuxize
区切り文字を一重引用符または二重引用符で囲むとどうなるかを見てみましょう。
cat <<- "EOF" The current working directory is: $PWD You are logged in as: $(whoami) EOF
区切り文字が引用符で囲まれている場合、パラメーターの展開とコマンドの置換はシェルによって行われないことに気付くことができます。
The current working directory is: $PWD You are logged in as: $(whoami)
if true; then cat <<- EOF Line with a leading tab. EOF fi
Line with a leading tab.
画面に出力を表示する代わりに、
>
、
>>
演算子を使用して出力をファイルにリダイレクトできます。
cat << EOF > file.txt The current working directory is: $PWD You are logged in as: $(whoami) EOF
file.txtが存在しない場合は作成されます。
>
を使用すると、ファイルは上書きされ、
>>
は出力をファイルに追加します。
ヒアドキュメントの入力もパイプすることができます。 次の例では、
sed
コマンドは
l
文字のすべてのインスタンスを
e
置き換えます。
cat <<'EOF' | sed 's/l/e/g' Hello World EOF
Heeeo Wored
パイプされたデータをファイルに書き込むには:
cat <<'EOF' | sed 's/l/e/g' > file.txt Hello World EOF
SSHでHeredocを使用する
Heredocを使用することは、SSHを介してリモートシステムで複数のコマンドを実行する最も便利で簡単な方法の1つです。
引用符で囲まれていない区切り文字を使用する場合は、すべての変数、コマンド、および特殊文字をエスケープする必要があります。エスケープしないと、ローカルで補間されます。
ssh -T [email protected] << EOF echo "The current local working directory is: $PWD" echo "The current remote working directory is: \$PWD" EOF
The current local working directory is: /home/linuxize The current remote working directory is: /home/user
SSHキーベースの認証を設定し、パスワードを入力せずにLinuxサーバーに接続することもできます。
結論
このガイドでは、
heredoc
とは何か、シェルスクリプトでそれを使用する方法を学びました。