為什麼這有效:
$ 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
會做同樣的事情而不呼叫任何外部命令。