【发布时间】:2016-08-25 14:21:43
【问题描述】:
以下命令看起来正确引用和转义:
$ echo -e ssh -q rmthost 'bash -c "ps -ef|grep '\'''\\\<'defunct'\\\>''\''|grep -v grep|awk '\'''{print \$1}''\'' "'
ssh -q sbpsvrwm757 bash -c "ps -ef|grep '\<defunct\>'|grep -v grep|awk '{print $1}' "
但是当执行时,结果不是预期的:
$ ssh -q rmthost 'bash -c "ps -ef|grep '\'''\\\<'defunct'\\\>''\''|grep -v grep|awk '\'''{print \$1}''\'' "'
root16986 16982 0 - ? 0:01 <defunct>
awk 命令似乎没有提取正确的列。
现在我点击了 Siguza 提供的链接并想出了:
$ echo ssh -q rmthost "'"bash -c '"ps -ef|grep '"'\<defunct\>'|grep -v grep|awk '{print \$1}'"'"'"'"
ssh -q rmthost 'bash -c "ps -ef|grep '\<defunct\>'|grep -v grep|awk '{print $1}'"'
看起来也完美逃脱了,但仍然不起作用:
$ ssh -q rmthost "'"bash -c '"ps -ef|grep '"'\<defunct\>'|grep -v grep|awk '{print \$1}'"'"'"'"
Missing }
或者,
$ echo ssh -q rmthost bash -c '"ps -ef|grep '"'\<defunct\>'|grep -v grep|awk '{print \$1}'"'"'
ssh -q rmthost bash -c "ps -ef|grep '\<defunct\>'|grep -v grep|awk '{print $1}'"
$ ssh -q rmthost bash -c '"ps -ef|grep '"'\<defunct\>'|grep -v grep|awk '{print \$1}'"'"'
root 16986 16982 0 - ? 0:01 <defunct>
或者,
$ echo ssh -q rmthost "bash -c \"ps -ef |grep '\<defunct\>'|grep -v grep| awk '{print \$1}'\""
ssh -q rmthost bash -c "ps -ef |grep '\<defunct\>'|grep -v grep| awk '{print $1}'"
$ ssh -q rmthost "bash -c \"ps -ef |grep '\<defunct\>'|grep -v grep| awk '{print \$1}'\""
root 16986 16982 0 - ? 0:01 <defunct>
知道为什么吗?
请注意,我需要 bash -c 来启用 bash 样式的输出重定向,如命令的 >/var/tmp/1.ouy 2>&1。
感谢您的帮助。
【问题讨论】:
-
谢谢。我遵循该规则,但仍然无法使其工作。查看上面的更新
-
ssh rmthost "ps -ef |grep \"\<defunct\>\"|grep -v grep| awk '{print \$1}' "有什么问题 - 还是我在这里遗漏了什么?即,通过将 ssh 的参数用双引号括起来,可以避免所有的尴尬。 -
bash -c在这里也是多余的。 ssh 会将命令字符串发送到 shell 本身,从而为您节省整个转义级别。 -
我忘了说我需要 bash -c 来启用 bash 样式的输出重定向 > /var/tmp/1.out 2>&1.用户的登录 shell 是 rmthost 上的 csh
-
我强烈建议学习 awk 以避免过多的`
grep | grep | awk。awk可以为您完成所有这些工作。
标签: bash