
なぜこれが機能するのか:
$ cat test.sh
#!/bin/bash
cat <(date|awk '{print $1}')
$ ./test.sh
Thu
ただし、bash に渡されるコマンドとしては使用しないでください。
$ bash -c "cat <(date|awk '{print $1}')"
Thu 2 Apr 2020 12:52:10 BST
私はこれをmacOSで実行しています
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
Copyright (C) 2007 Free Software Foundation, Inc.
答え1
ワンライナーでは、 は$1
二重引用符で囲まれた文字列内にあります。
"cat <(date|awk '{print $1}')"
これは、対話型シェルによって展開されることを意味します。最初の位置パラメータ$1
が空の場合、空の文字列に展開され、awk
入力をそのまま出力するプログラムになります。
awk '{print }'
シェルがそれを展開しないようにするには、in$
をエスケープします。完全なコマンドは次のようになります。$1
\$1
bash -c "cat <(date|awk '{print \$1}')"
スクリプト バリアントでは、 は$1
単一引用符で囲まれた文字列です。したがって、シェルはそれを展開しようとしません。
しかし、この特定のケースでは、単に
date +%a
曜日の略称を印刷します。strftime(3)
マニュアル( man 3 strftime
)も参照してください。
新しいbash
バージョン(リリース4.2以降、つまりデフォルト bash
macOSでは、例えば自家製)、
printf '%(%a)T\n' -1
外部コマンドを呼び出さずに同じことを実行します。