如何在gnome-terminal命令中使用变量?echo $1无输出求解
解决gnome-terminal中执行命令时变量无输出的问题
你的问题核心出在变量解析的时机上——你写的gnome-terminal -e 'sh -c "echo $1"'里,$1会被你当前的shell先解析,而不是留给新启动的sh -c进程处理。如果当前shell没有位置参数(比如你直接在终端敲这条命令,不是在脚本里执行),$1就是空值,所以新终端里执行的其实是echo ,自然没输出。
下面给你几种正确的用法,根据你的需求选择:
1. 传递当前shell的变量给新终端
假设你当前shell里已经定义了一个变量,比如my_msg="Hello from your main terminal",可以用下面的命令:
gnome-terminal -- sh -c 'echo "Received message: \$1" ; exec bash' -- "$my_msg"
这里的关键点:
--是告诉gnome-terminal,后面的内容是要传递给它执行的命令的参数,避免和gnome-terminal自身的参数混淆。\$1转义了美元符号,让当前shell不会提前解析它,而是留给sh -c去读取第一个参数。exec bash是为了让新终端在执行完echo命令后保持打开,否则终端会一闪而过,你可能看不到输出。
2. 直接在新终端里使用变量(提前展开)
如果你想让当前shell先把变量值展开,再传递给新终端执行,也可以用双引号包裹外层命令:
my_msg="Hi there!" gnome-terminal -- sh -c "echo '$my_msg' ; exec bash"
这种写法下,当前shell会先把$my_msg替换成它的值,然后传递给sh -c,新终端执行的就是echo 'Hi there!'。如果变量里有空格或特殊字符,用单引号把变量值包起来更安全。
3. 传递多个参数给新终端
如果需要传递多个变量,同样用--来分隔参数:
var1="First item" var2="Second item" gnome-terminal -- sh -c 'echo "1: $1, 2: $2" ; exec bash' -- "$var1" "$var2"
这样sh -c里的$1对应var1的值,$2对应var2的值,逻辑非常清晰。
为什么你的原命令无效?
再回头拆解你的原命令:gnome-terminal -e 'sh -c "echo $1"'
- 单引号包裹的内容里,内层的双引号会让
$1被当前shell提前解析;如果当前shell没有设置$1(比如你不是在脚本里运行这条命令),$1就是空的,传递给sh -c的命令变成了echo,自然没有输出。 - 即使你当前shell有
$1,它也会被提前替换成对应的值,而不是让sh -c自己读取参数。
内容的提问来源于stack exchange,提问作者Bhavik Joshi
相关产品推荐
相关产品推荐

