调用xterm执行带变量命令出错求助:echo变量无输出
解决csh脚本中xterm执行echo $msg1无输出的问题
这个问题的核心是csh的单引号变量替换规则导致的,咱们一步步来解决:
问题根源
你在exec命令里用了单引号包裹sh -c的命令串:
exec /usr/bin/xterm -e sh -c 'echo "$msg1" | tr "#" "\n" ;sleep 5'
在csh中,单引号内部的变量(比如$msg1)不会被解析替换,所以这条命令传递给sh的内容里,$msg1是sh环境下的变量,但sh并没有定义这个变量,自然就没有输出了。
而你后面的两个测试命令能正常工作,是因为它们都是直接写死的字符串,不需要变量替换。
修复方案
把包裹sh -c命令串的单引号换成双引号,同时给echo的参数和tr的参数加上单引号,确保变量内容正确传递且不会被sh错误解析:
exec /usr/bin/xterm -e sh -c "echo '$msg1' | tr '#' '\n' ; sleep 5"
这样csh会先把$msg1替换成实际的内容(也就是#[INFO] xx#[INFO] yy),再把完整的命令串传递给sh执行,就能正常输出头部信息了。
修复后的完整脚本
#!/bin/csh -f set msg1 = "" set msg1 = "$msg1#[INFO] xx" set msg1 = "$msg1#[INFO] yy" # 修复后的命令 exec /usr/bin/xterm -e sh -c "echo '$msg1' | tr '#' '\n' ; sleep 5" # 可选的测试命令,可保留或注释 # exec /usr/bin/xterm -e sh -c 'echo hello;sleep 5' # exec /usr/bin/xterm -e sh -c 'echo hello#world | tr "#" "\n" ;sleep 5'
扩展说明
如果你的msg1变量里包含单引号,那需要先对单引号进行转义,避免破坏命令串的结构。比如可以用csh的替换功能处理:
set msg1_escaped = "$msg1:s/'/'\\\\''/g" exec /usr/bin/xterm -e sh -c "echo '$msg1_escaped' | tr '#' '\n' ; sleep 5"
不过你的例子里没有这种情况,暂时不需要考虑。
内容的提问来源于stack exchange,提问作者user466130
相关产品推荐
相关产品推荐

