为什么这有效:
$ 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
会做同样的事情而不调用任何外部命令。