You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:18:12