从脚本打开新的gnome-terminal并从当前脚本输入变量。

时间:2018-04-19 14:02:44

标签: linux bash shell terminal sh

#!/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 
stat=`wget -O ".dockerid" http://$IP/DOCKER-STAT.txt`
for ids in `cat .dockerid`
do
if [ "$ids" == "$DockerMachine" ] ; then
gnome-terminal -x sh -c 'sshfs -p$DockerPort $DockerUser@$IP:/var/www/html $Dpath ; bash '
nautilus $Dpath
zenity --info --text "Mounted $DockerMachine"
exit
else
:
fi
done
zenity --info --text "No Such ID:$DockerMachine"
fi
  

gnome-terminal -x sh -c'sshfs -p $ DockerPort $ DockerUser @ $ IP:/ var / www / html $ Dpath; bash'

此命令打开一个新终端,但问题是它不会从此脚本加载像$ DockerPort $ DockerUser $ IP $ Dpath这样的变量。

如何将这些变量中的值从此脚本输入到新打开的终端?

谢谢!

1 个答案:

答案 0 :(得分:0)

如前所述,您可以尝试在sshfs调用周围使用双引号而不是单引号。

Bash中的单引号用于分隔逐字文本,其中不扩展变量。相反,双引号允许进行变量扩展和命令替换($(...))。

如果您使用双引号,请注意意外的副作用(您的用户名可能包含空格,美元,分号或任何其他shell特殊字符)。一个更干净的方法是在调用gnome-terminal之前将变量导出到环境中(并且不要忘记在单引号的里面添加双引号),这样你的代码就像: / p>

export Docker{Port,User} IP Dpath
gnome-terminal -x sh -c 'sshfs -p"$DockerPort" "$DockerUser@$IP":/var/www/html "$Dpath" ; bash'

您可能不希望使用仅使用一次的变量来污染环境。如果是这种情况,那么您可以使用Bash的export功能序列化变量,然后将其加载到新环境中,而不是declare -p它们(在我看来,这是最干净的方法) )。这是它的样子:

set_vars="$(declare -p Docker{Port,User} IP Dpath)"
gnome-terminal -x bash -c "$set_vars;"'sshfs ....'

使用这种最新方法,变量只对运行sshfs命令的shell进程可见,而不是gnome-terminal本身,也不会运行任何子进程。

PS:您可以使用以下代码而不是重复的sed调用从〜/ .medmadoc文件中一次读取所有变量:

for var in IP Docker{Machine,User,Pass,Port}; do 
  read $var
done < ~/.medmadoc

此代码使用read内置函数,它将一行输入读入变量(最简单的形式)。

PPS:stat变量可能不会包含任何有用的信息,因为wget的输出被-O标志重定向。也许你的意思是将wget的结果代码存储到stat中,在这种情况下你的意思是:

wget -O .dockerid ...
stat=$?