透過 -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}')"

這意味著它將透過互動式 shell 進行擴展。如果第一個位置參數$1為空,它會將其擴展為空字串,從而導致awk程式僅列印其輸入:

awk '{print }'

轉義$in$1\$1阻止 shell 嘗試擴展它。你的完整命令將如下所示

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

在您的腳本變體中,$1位於單引號字串中。因此 shell 不會嘗試擴展它。

但在這種特殊情況下,最好只使用

date +%a

列印當天的縮寫名稱。另請參閱strftime(3)手冊 ( man 3 strftime)。

在較新的bash版本中(發行版 4.2+,即不含預設 bash在 macOS 上,但透過例如安裝的自製),

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

會做同樣的事情而不呼叫任何外部命令。

相關內容