awk 打印在 bash -c 中不起作用

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造成这种情况的空间是什么?

ste*_*ver 6

这里没有什么特别的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)

  • @foki 在 shell 中引用和转义总是很痛苦。这是你必须习惯并学习如何处理的事情......如果你需要多个嵌套级别的引用(例如使用“bash -c”,“ssh”和许多其他),就像你的问:请参阅[为什么我的 shell 脚本因空格或其他特殊字符而阻塞?](https://unix.stackexchange.com/questions/131766/why-does-my-shell-script-choke-on-whitespace-or -other-special-characters)并确保点击 [quoting](https://unix.stackexchange.com/questions/tagged/quoting) 标签的链接。 (3认同)