yuj*_*iyu 2 bash awk shell-script
我注意到这工作正常(只会打印unattended-upgrades进程的 PID):
lslocks | awk '/unattended-upgrades/ { print $2 }'
Run Code Online (Sandbox Code Playgroud)
但这实际上忽略了该print部分(将打印整行):
bash -c "lslocks | awk '/unattended-upgrades/ { print $2 }'"
Run Code Online (Sandbox Code Playgroud)
这是 Ubuntu 18.04 和 Bash 版本 4.4.20。
bash -c造成这种情况的空间是什么?
这里没有什么特别的bash -c- 事实上外部双引号允许$2交互式 shell 的扩展:
$ set -x
$ bash -c "echo foo bar | awk '{ print $2 }'"
+ bash -c 'echo foo bar | awk '\''{ print }'\'''
foo bar
Run Code Online (Sandbox Code Playgroud)
(这里的“问题”是单引号在双引号内并不特殊;外部双引号“保留其字面值”。请参阅Bash 参考手册 3.1.2.3 双引号。)
比较:
$ bash -c "echo foo bar | awk '{ print \$2 }'"
+ bash -c 'echo foo bar | awk '\''{ print $2 }'\'''
bar
Run Code Online (Sandbox Code Playgroud)