通过 -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

会做同样的事情而不调用任何外部命令。

相关内容