-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行のコードで$1二重引用符で囲まれた文字列内に、次のように入力します。

"cat <(date|awk '{print $1}')"

これは、対話型シェルを介して拡張されることを意味します。最初の位置引数$1が空の場合は、空の文字列に展開してawkプログラムに入力内容のみを印刷させます。

awk '{print }'

シェルが拡張しようとするのを防ぐために脱出してください$。完全なコマンドは次のとおりです。$1\$1

bash -c "cat <(date|awk '{print \$1}')"

スクリプトバリアントで$1一重引用符で囲まれた文字列の内部。したがって、シェルはそれを拡張しようとしません。

しかし、この特別な場合は、単に使用することをお勧めします。

date +%a

曜日の略称を印刷します。strftime(3)マニュアル()も参照してくださいman 3 strftime

最新bashバージョン(distro 4.2+、つまり基本 bashmacOSでは、以下を介してインストールされます。自分で作った)、

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

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

関連情報