bash - watch 命令不适用于特殊字符和引号
问题描述
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' )'
解决方案
您没有提供可重现的示例,但我想我设法制作了一个用于测试的示例:
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'\'')'
推荐阅读
- java - MiniMax 算法的一个非常有趣的问题。什么可能导致这种行为?
- docker - 在不运行镜像的情况下显示安装在 docker 镜像中的包
- c# - ASP.net MVC problem in Controller managing a [HttpPost] : renders Layout and Page twice
- ios - vImageMatrixMultiply_ARGB8888ToPlanar8 在构建发布模式 iOS 应用程序时不起作用
- r - 为什么在 R 中建模比返回的对象消耗更多的内存
- sql-server - 从 SQL 的列中选择不同出现的子字符串
- java - 使用 Feign @RequestLine 添加 decodeSlash
- amazon-web-services - 同一VPC的不同cidr块中的资源是否可以相互访问aws
- oracle - Oracle 中的函数。需要使用 Oracle Function 搜索并找到传递的参数
- css - 为文本制作带有渐变的底部边框