835

複数行の入力をプログラムに入力するためのスクリプトを作成する必要がありました ( psql)。

少しグーグルで調べたところ、次の構文が機能することがわかりました。

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

`pg_dump ----something`

update table .... statement ...;

END;
EOF

BEGIN;これにより、複数行の文字列 ( からまでを含む)が正しく作成さEND;れ、 への入力としてパイプされますpsql

しかし、私はそれがどのように/なぜ機能するのかわかりません.誰かが説明してもらえますか?

私は主に を参照しています。ファイルへの出力、ファイルへの追加、ファイルからの入力の読み取りcat << EOFを知っています。>>><

正確には何をし<<ますか?

そして、そのマニュアルページはありますか?

4

11 に答える 11

679

このcat <<EOF構文は、Bash で複数行のテキストを扱う場合に非常に便利です。複数行の文字列をシェル変数、ファイル、またはパイプに割り当てるとき。

cat <<EOFBashでの構文の使用例:

1. 複数行の文字列をシェル変数に割り当てる

$ sql=$(cat <<EOF
SELECT foo, bar FROM db
WHERE foo='baz'
EOF
)

変数は$sql改行文字も保持するようになりました。で確認できますecho -e "$sql"

2. 複数行の文字列を Bash のファイルに渡す

$ cat <<EOF > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
EOF

print.shファイルには次のものが含まれています。

#!/bin/bash
echo $PWD
echo /home/user

3. 複数行の文字列を Bash のパイプに渡す

$ cat <<EOF | grep 'b' | tee b.txt
foo
bar
baz
EOF

b.txtファイルにはbarbaz行が含まれています。同じ出力が に出力されstdoutます。

于 2014-02-04T10:28:37.200 に答える
630

これはヒアドキュメント形式と呼ばれ、標準入力に文字列を提供します。詳細については、 https://en.wikipedia.org/wiki/Here_document#Unix_shellsを参照してください。


からman bash:

ヒアドキュメント

このタイプのリダイレクトは、シェルに現在のソースから入力を読み取るように指示し、単語のみを含む (末尾の空白がない) 行が表示されるまで続けます。

その時点までに読み取られたすべての行は、コマンドの標準入力として使用されます。

ヒアドキュメントの形式は次のとおりです。

          <<[-]word
                  here-document
          delimiter

wordでは、パラメーター展開、コマンド置換、算術展開、またはパス名展開は実行されません 。word内の文字が引用符で囲まれている場合、 区切り文字はwordでの引用符の削除の結果であり、ヒアドキュメントの行は展開されません。wordが引用符で囲まれてい ない場合、ヒアドキュメントのすべての行が パラメーター展開、コマンド置換、および算術展開の対象となります。後者の場合、文字シーケンス\<newline>は無視され、文字、、および\を引用するために使用する必要があります。\$`

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

于 2010-03-23T13:58:41.800 に答える
392

あなたの場合、「EOF」は「ヒアタグ」として知られています。基本的<<Hereに、「タグ」まで複数行の文字列を入力することをシェルに伝えますHere。このタグには好きな名前を付けることができます。多くの場合EOF、 またはSTOPです。

Here タグに関するいくつかのルール:

  1. タグは、大文字または小文字の任意の文字列にすることができますが、ほとんどの人は慣例により大文字を使用します。
  2. その行に他の単語がある場合、タグは Here タグとは見なされません。この場合、単に文字列の一部と見なされます。タグは、タグと見なされるように、別の行に単独で配置する必要があります。
  3. タグと見なされるには、その行の先頭または末尾にスペースを含めないでください。それ以外の場合は、文字列の一部と見なされます。

例:

$ cat >> test <<HERE
> Hello world HERE <-- Not by itself on a separate line -> not considered end of string
> This is a test
>  HERE <-- Leading space, so not considered end of string
> and a new line
> HERE <-- Now we have the end of the string
于 2014-08-22T08:48:39.433 に答える
119

POSIX7

kennytm が引用されman bashていますが、そのほとんどは POSIX 7 でもあります: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04 :

リダイレクション演算子「<<」と「<<-」はどちらも、「ヒアドキュメント」と呼ばれるシェル入力ファイルに含まれる行をコマンドの入力にリダイレクトできます。

ヒアドキュメントは、次の単語の後に始まり、その間に文字がなく<newline>、区切り記号と a のみを含む行が存在するまで続く単一の単語として扱われます。次に、次のヒアドキュメントがあれば、それが開始されます。形式は次のとおりです。<newline><blank>

[n]<<word
    here-document
delimiter

ここで、オプションの n はファイル記述子番号を表します。番号を省略した場合、ヒアドキュメントは標準入力 (ファイル記述子 0) を参照します。

単語内の任意の文字が引用されている場合、区切り文字は単語の引用削除を実行することによって形成され、ヒアドキュメント行は展開されません。それ以外の場合、区切り文字は単語そのものになります。

Word 内の文字が引用符で囲まれていない場合、ヒアドキュメントのすべての行は、パラメーター展開、コマンド置換、および算術展開のために展開されます。この場合、<backslash>入力内の は<backslash>内側の二重引用符として動作します (二重引用符を参照)。ただし、二重引用符 ( '"' ) は、"$()"、"``"、または "${}" 内に二重引用符が表示される場合を除き、ヒア ドキュメント内で特別に扱われません。

リダイレクト記号が「<<-」の場合、<tab>入力行と末尾の区切り文字を含む行から先頭のすべての文字が削除されます。行に複数の「<<」または「<<-」演算子が指定されている場合、最初の演算子に関連付けられたヒアドキュメントがアプリケーションによって最初に提供され、シェルによって最初に読み取られる必要があります。

ヒアドキュメントが端末デバイスから読み取られ、シェルが対話型の場合、区切り文字が認識されるまで、入力の各行を読み取る前に、シェル変数で説明されているように処理された変数 PS2 の内容を標準エラーに書き込む必要があります。

まだ与えられていないいくつかの例。

引用符はパラメーターの展開を防ぎます

引用符なし:

a=0
cat <<EOF
$a
EOF

出力:

0

引用符付き:

a=0
cat <<'EOF'
$a
EOF

または(醜いが有効):

a=0
cat <<E"O"F
$a
EOF

出力:

$a

ハイフンは先頭のタブを削除します

ハイフンなし:

cat <<EOF
<tab>a
EOF

<tab>リテラル タブであり、次のように挿入できます。Ctrl + V <tab>

出力:

<tab>a

ハイフン付き:

cat <<-EOF
<tab>a
<tab>EOF

出力:

a

catこれはもちろん、周囲のコードのようにインデントできるようにするために存在します。これにより、読みやすく、維持しやすくなります。例えば:

if true; then
    cat <<-EOF
    a
    EOF
fi

残念ながら、これはスペース文字には機能しません。POSIX はtabここでインデントを優先しました。うわぁ。

于 2015-06-09T09:41:52.003 に答える
4

<< EoF基本的には次のことを意味します:

<<- 「次の行から始まる複数行の入力を読み取り、別のファイル内のコードであるかのように扱います」

EoFEoF- 「複数行入力で単語が見つかった直後に読み上げを停止する」

他の回答が説明したように、複数行の入力はヒアドキュメントと呼ばれます

ヒア ドキュメントは、多くの場合、後続のプロセスに渡される出力を生成するために使用されます。たとえばcat << EoF、ヒア ドキュメントを使用して、目的の出力を生成するために使用できます。

ヒア ドキュメントを使用してその場でテキスト ドキュメントを作成する例を次に示します。

cat << EoF > ./my-document.txt
Hello world
Have a nice day
EoF
于 2022-01-19T22:21:05.883 に答える