-c 経由で bash に渡されたスクリプトが動作しない

-c 経由で bash に渡されたスクリプトが動作しない

なぜこれが機能するのか:

$ 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以降、つまりデフォルト bashmacOSでは、例えば自家製)、

printf '%(%a)T\n' -1

外部コマンドを呼び出さずに同じことを実行します。

関連情報