watch命令执行含特殊字符与引号的命令时报unexpected token `('错误如何解决?
问题成因
watch命令默认调用sh执行传入的命令,而进程替换语法<()是bash、zsh等非POSIX标准shell的专属特性,原生sh不支持该语法,所以解析到(时就会抛出语法错误。你直接在终端执行命令时用的是bash/zsh环境,所以可以正常运行,套上watch后执行环境切换为sh,就会触发报错。
解决方法
方法1:显式指定bash执行
将需要运行的命令作为参数传给bash -c即可,注意内层引号要做转义处理:
watch -n 1 "bash -c 'paste <(ssh ai02 \"nvidia-smi pmon -s um -c 1\") <(ssh ai03 \"nvidia-smi pmon -s um -c 1\")'"
方法2:临时指定watch使用的shell
执行watch前声明SHELL环境变量为bash,不需要修改原命令的引号结构,写法更简洁:
SHELL=/bin/bash watch -n 1 "paste <(ssh ai02 'nvidia-smi pmon -s um -c 1') <(ssh ai03 'nvidia-smi pmon -s um -c 1' )"
方法3:用临时文件实现拼接(兼容POSIX标准)
如果不想依赖bash特性,可以先将两个服务器的查询结果写入临时文件再做拼接:
watch -n 1 "ssh ai02 'nvidia-smi pmon -s um -c 1' > /tmp/ai02_gpu.tmp; ssh ai03 'nvidia-smi pmon -s um -c 1' > /tmp/ai03_gpu.tmp; paste /tmp/ai02_gpu.tmp /tmp/ai03_gpu.tmp"
内容的提问来源于stack exchange,提问作者JimmyJ
相关产品推荐
相关产品推荐

