【问题标题】:watch command not working with special characters and quoteswatch 命令不适用于特殊字符和引号
【发布时间】:2021-11-07 18:09:55
【问题描述】:
watch -n 1 "paste <(ssh ai02 'nvidia-smi pmon -s um -c 1') <(ssh ai03 'nvidia-smi pmon -s um -c 1' )"

上述命令用于将两个服务器 GPU 统计信息水平堆叠在一起。它可以在没有 watch 命令的情况下工作,但会出现以下错误

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `paste <(ssh ai02 'nvidia-smi pmon -s um -c 1') <(ssh ai03 'nvidia-smi pmon -s um -c 1' )'

【问题讨论】:

  • 顺便说一句:sh != bash
  • 这是shell扩展和引用的经常性问题。
  • 关注 Cyrus 和 Ronaldo,因此,将您的命令行 paste &lt;(ssh ai02 'nvidia-smi pmon -s um -c 1') &lt;(ssh ai03 'nvidia-smi pmon -s um -c 1' ) 放入 bash shell 脚本(带有 bash shebang)并使用 watch 命令执行它。

标签: bash awk pipe watch nvidia-smi


【解决方案1】:

您没有提供可重现的示例,但我想我设法制作了一个用于测试:

watch -n1 "paste <(seq -w 1000 | shuf -n '10' ) <(seq -w 1000 | shuf -n '10')"

输出类似的错误:

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `paste <(seq -w 1000 | shuf -n '10' ) <(seq -w 1000 | shuf -n '1
0')'

为了更简单的解决这个问题,我们可以把sh -c换成bash -c

watch -n1 -x bash -c 'paste <(seq -w 1000 | shuf -n "10" ) <(seq -w 1000 | shuf -n "10")'

来自watch 手册:

-x, --exec
     Pass command  to exec(2) instead of  sh -c which reduces  the need to
     use extra quoting to get the desired effect.

如果您需要维护原始命令行中的撇号,您也可以转义:

watch -e -n1 -x bash -c 'paste <(seq -w 1000 | shuf -n '\''10'\'' ) <(seq -w 1000 | shuf -n '\''10'\'')'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2016-09-13
    相关资源
    最近更新 更多