1. ホーム
  2. linux

[解決済み] bashで "cat << EOF "はどのように動作するのですか?

2022-03-20 08:07:35

質問

プログラムに複数行の入力を行うスクリプトを書く必要があった ( psql ).

ちょっとググってみたところ、以下のような構文が有効であることがわかりました。

cat << EOF | psql ---params
BEGIN;

`pg_dump ----something`

update table .... statement ...;

END;
EOF

これは、複数行の文字列を正しく構築します ( BEGIN; から END; への入力としてパイプします。 psql .

しかし、私はそれがどのように/なぜ動作するのかがわからない、誰か説明してくださいませんか?

主に cat << EOF 知ってる > をファイルに出力します。 >> をファイルに追加します。 < ファイルから入力を読み込む。

はどのようなものですか? << を正確に教えてください。

また、そのマニュアルはあるのでしょうか?

解決方法は?

これは ヘルドック フォーマット を使用して、標準入力に文字列を提供します。参照 https://en.wikipedia.org/wiki/Here_document#Unix_shells をご覧ください。


から man bash :

ここからドキュメント

このタイプのリダイレクションは、シェルに対して、入力が 現在のソースから 単語のみ(末尾はなし)で構成される が表示されます。

その時点までに読み込まれたすべての行は、その時点で コマンドの標準入力になります。

here-documentsのフォーマットは。

          <<[-]word
                  here-document
          delimiter

パラメータ展開、コマンド置換、算術展開、および にはパス名展開が行われます。 単語 . の中に文字がある場合 単語 は が引用された場合 デリミタ の引用符除去の結果です。 単語 という行があります。 の中の ここドキュメント は展開されない。 もし 単語 のすべての行が引用符で囲まれていない場合 ここドキュメント は、パラメータ展開、コマンド 代入、算術演算 を展開します。 後者の場合 文字列 \<newline> は は無視され \ は引用符で囲む必要があります。 \ , $ および ` .

リダイレクト演算子が <<- の場合、すべての先頭のタブ文字が は入力行から取り除かれ を含む行は デリミタ . これは これにより、シェルスクリプト内のヒアドキュメントを自然な形でインデントすることができます。