Bash

bash でコレ(文字列 or 変数の値 or コマンド標準出力 or ファイル内容)をアレ(コマンドライン引数 or コマンド標準入力 or 入力ファイル引数)としてコマンドに入力する方法

bash でコレをアレとしてコマンドに入力したい時がある.「コレ」とは,文字列,変数の値,コマンドの標準出力,ファイルの内容,のいずれかである.「アレ」とはコマンドライン引数,コマンドの標準入力,入力ファイル引数,のいずれかである.これら「コレ」と「アレ」のすべての組み合わせにおいて, bash でどう書けるかをまとめて表にしておくという,誰もが知っていて当然の内容なので私以外の誰も得をしないことが決定的に明らかなエントリである.

コレ\アレ コマンドライン引数
(echo コマンドの引数を例とする)
コマンドの標準入力
(cat コマンドの標準入力を例とする)
入力ファイル引数
(cat コマンドの引数を例とする)
文字列
(Hello, world! を例とする)
echo 'Hello, world!' echo -n 'Hello, world!' | cat1

cat <<'EOS'
Hello, world!
EOS
2 3

cat <<<'Hello, world!'2

cat < <(echo -n 'Hello, world!')1 4
cat <(echo -n 'Hello, world!')1
変数の値
(変数名 var を例とする)
echo "$var" echo -n "$var" | cat1

cat <<<$var2 5

cat < <(echo -n "$var")1 4
cat <(echo -n "$var")1
コマンドの標準出力
(echo 'Hello, world!' の標準出力を例とする)
echo "$(echo 'Hello, world!')"6

(脚注7も参照のこと)
echo 'Hello, world!' | cat

cat <<<$(echo 'Hello, world!')5 8

cat < <(echo 'Hello, world!')4
cat <(echo 'Hello, world!')
ファイルの内容
(ファイル名 file を例とする)
echo "$(cat file)"6

echo "$(<file)"6 9

(脚注7も参照のこと)
cat <file cat file
  1. echo-n オプションを指定しないとコレの最後に改行が加わる.
  2. コレの最後に改行が加わる.
  3. EOS は bash の word として妥当な文字列であれば何でもよい.
  4. コレを(最後の改行の付加など)一切の変更を加えることなくコマンドの標準入力へ流し込める. pipe による書き方も同じ要求を満たすが, pipe はコマンドが subshell で起動される一方,この書き方はコマンドが現在の shell 環境で実行されるため,この書き方が必要になる文脈がある.
  5. <<< の次の word は word splitting の対象とならないため quote する必要はない.
  6. コレの最後において連続する改行が削除される.
  7. コレを(最後において連続する改行の削除など)一切の変更を加えることなくコマンドライン引数とする方法としては https://stackoverflow.com/questions/15184358/ 等を参照のこと.
  8. コレの最後において連続する改行が1つの改行に置き換わる.「command substitution の展開の際,最後おいて連続する改行が削除される」と「here string による標準入力の最後に改行が加わる」という仕様が組み合わさった結果である.
  9. echo "$(cat file)" よりも速い(と bash のドキュメントに書いてある).