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)
在您的脚本变体中,$1
is 在单引号字符串中。因此,外壳不会尝试扩展它。
不过,在这种特定情况下,最好只使用
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)
会在不调用任何外部命令的情况下做同样的事情。
归档时间: |
|
查看次数: |
590 次 |
最近记录: |