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

如何从Bash脚本打开新gnome-terminal并传入当前脚本变量

解决Gnome Terminal传递Bash变量并执行命令的问题

我来帮你搞定这个问题——你遇到的核心问题是单引号会阻止Bash变量扩展,导致新启动的gnome-terminal里无法识别原脚本中定义的Dpath、IP等变量。下面是修改后的完整脚本和关键细节说明:

修改后的完整脚本

#!/bin/bash

# 定义变量,改用$()做命令替换,给路径加双引号避免空格问题
Dpath="/home/$USER/Docker/"
IP=$(sed -n 1p /home/medma/.medmadoc)
DockerMachine=$(sed -n 2p /home/$USER/.medmadoc)
DockerPort=$(sed -n 5p /home/$USER/.medmadoc)
DockerUser=$(sed -n 3p /home/$USER/.medmadoc)
DockerPass=$(sed -n 4p /home/$USER/.medmadoc)

if [ ! -d "$Dpath" ] ; then
    mkdir -p "$Dpath"
else
    # 获取Docker状态文件,原脚本的stat变量未使用,直接执行wget即可
    wget -O ".dockerid" "http://$IP/DOCKER-STAT.txt"
    # 遍历dockerid中的每一项
    for ids in $(cat .dockerid)
    do
        if [ "$ids" == "$DockerMachine" ] ; then
            # 关键:用双引号包裹sh命令,让原脚本先解析变量值
            # 添加exec bash让终端执行完命令后保持打开
            gnome-terminal -- sh -c "sshfs -p$DockerPort $DockerUser@$IP:/var/www/... \"$Dpath\"; exec bash"
        fi
    done
fi

关键修改点说明

  • 替换单引号为双引号:原脚本中sh -c后的单引号会让变量以字面量形式传递,换成双引号后,原脚本会先把$DockerPort、$IP等变量解析为实际值,再传递给新终端的shell。
  • 添加exec bash:执行完sshfs命令后,新终端会自动关闭,加上这一句可以让终端保持运行,方便后续操作。
  • 给路径和变量加双引号:比如"$Dpath",避免路径或变量值中包含空格时出现错误,这是Bash脚本的最佳实践。
  • 改用$()做命令替换:替代旧的反引号写法,可读性更强,也支持嵌套场景。
  • 使用--分隔参数:gnome-terminal --用来明确分隔终端的参数和要执行的命令,避免潜在的参数冲突。

内容的提问来源于stack exchange,提问作者ConfusedClown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:06:05