通过 -c 传递给 bash 时脚本不起作用

Rob*_*att 6 bash quoting process-substitution

为什么这样做:

$ cat test.sh
#!/bin/bash
cat <(date|awk '{print $1}')

$ ./test.sh
Thu
Run Code Online (Sandbox Code Playgroud)

但不是作为传递给 bash 的命令:

$ bash -c "cat <(date|awk '{print $1}')"
Thu  2 Apr 2020 12:52:10 BST
Run Code Online (Sandbox Code Playgroud)

我在 macOS 上运行这个

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
Copyright (C) 2007 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 22

在您的单行中,$1是在双引号字符串中:

"cat <(date|awk '{print $1}')"
Run Code Online (Sandbox Code Playgroud)

这意味着它将被交互式 shell 扩展。如果第一个位置参数$1为空,它会将其扩展为空字符串,从而生成一个awk仅打印其输入的程序:

awk '{print }'
Run Code Online (Sandbox Code Playgroud)

逃离$$1作为\$1从试图扩大它停止外壳。你的完整命令看起来像

bash -c "cat <(date|awk '{print \$1}')"
Run Code Online (Sandbox Code Playgroud)

在您的脚本变体中,$1is 在单引号字符串中。因此,外壳不会尝试扩展它。

不过,在这种特定情况下,最好只使用

date +%a
Run Code Online (Sandbox Code Playgroud)

打印当天的缩写名称。另请参阅strftime(3)手册 ( man 3 strftime)。

在较新的bash版本中(4.2+ 版本,即不是macOS上的默认 bash版本,而是通过例如Homebrew安装的版本),

printf '%(%a)T\n' -1
Run Code Online (Sandbox Code Playgroud)

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