web-dev-qa-db-ja.com

<<<はどういう意味ですか?

<<<はどういう意味ですか?次に例を示します。

$ sed 's/a/b/g' <<< "aaa"
bbb

より一般的なLinuxコマンドで機能するものはありますか?

sedプログラムに文字列aaaを供給しているようですが、通常、<<または<が使用されていませんか?

136
Daniel Jonsson

他は基本的な質問に答えました:それは何ですか?なぜそれが役立つのか見てみましょう。

次のように、コマンドの標準入力に文字列を渡すこともできます。

echo "$string" | command

ただし、bashでは、パイプを導入すると、個々のコマンドがサブシェルで実行されます。このことを考慮:

echo "hello world" | read first second
echo $second $first

2番目のechoコマンドの出力では、1つのスペースだけが出力されます。なぁ?変数はどうなりましたか?読み取りコマンドはパイプライン内にあるため、サブシェルで実行されます。 stdinから2ワードを正しく読み取り、変数に割り当てます。しかし、その後コマンドは完了し、サブシェルは終了となり、変数は失われます。

中括弧でこれを回避できる場合があります:

echo "hello world" | {
    read first second
    echo $second $first
}

値の必要性が含まれていても問題ありませんが、スクリプトの現在のシェルにはまだこれらの変数がありません。この混乱する状況を改善するには、ヒア文字列を使用します

read first second <<< "hello world"
echo $second $first

ああ、はるかに良い!

183
glenn jackman

<<<は、ヒア文字列を示します。

$ cat <<< 'hi there'
hi there

右側のWordを左側のコマンドの標準入力に渡します。


<<はヒアドキュメントを示します。

$ cat <<EOF
> hi
> there
> EOF
hi
there

EOFは任意のWordにすることができます。

ここでドキュメントは、ファイル全体を作成したり、長いメッセージを表示したりするために、シェルスクリプトで一般的に使用されます。

cat > some-file <<FILE
foo
bar
bar bar
foo foo
FILE

<は、ファイルの内容をコマンドの標準入力に渡します。

$ cat < /etc/fstab
/dev/sda2               /boot   ext4            nosuid,noexec,nodev,rw,noatime,nodiratime       0 2
/dev/sda4               /       ext4            rw,noatime,nodiratime,  0 1
/dev/sdb5               /var    ext4            nosuid,noexec,nodev,rw,relatime 0 2
 ...
84
user26112

Bash man page を見てください。この表記は、hereドキュメントhere文字列と呼ばれるものの一部です。これにより、複数行のデータ入力を1つの連続した文字列として生成できます。あなたが尋ねているバリエーションは、ここで文字列と呼ばれています。

Bash manページからの抜粋

Here Strings
   A variant of here documents, the format is:

          <<<Word

   The Word is expanded and supplied to the command on its standard input.
16
slm

ここで文字列を意味します。

<<< strings

文字列が展開され、標準入力でコマンドに提供されます。

あなたの例では、文字列aaaはstdinを介してsedコマンドにフィードされます。

5
cuonglm