Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从脚本中打开新的gnome终端,并从当前脚本中输入变量。_Linux_Bash_Shell_Terminal_Sh - Fatal编程技术网

Linux 从脚本中打开新的gnome终端,并从当前脚本中输入变量。

Linux 从脚本中打开新的gnome终端,并从当前脚本中输入变量。,linux,bash,shell,terminal,sh,Linux,Bash,Shell,Terminal,Sh,gnome终端-x sh-c'sshfs-p$DockerPort$DockerUser@$IP:/var/www/html$Dpath;巴什 此命令将打开一个新的终端,但问题是它不会从此脚本加载$DockerPort$DockerUser$IP$Dpath之类的变量 如何将这些变量中的值从此脚本输入到新打开的终端 谢谢 如前所述,您可以尝试在sshfs调用周围使用双引号而不是单引号 Bash中的单引号用于分隔逐字文本,其中变量不展开。相反,双引号允许进行变量扩展和命令替换($(…)) 如果您使

gnome终端-x sh-c'sshfs-p$DockerPort$DockerUser@$IP:/var/www/html$Dpath;巴什

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

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


谢谢

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

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

如果您使用双引号,请注意意外的副作用(您的用户名可能包含空格、美元、分号或任何其他shell特殊字符)。一种更简洁的方法是在调用gnome终端之前将变量导出到环境中(不要忘记在单引号内的变量周围添加双引号),这样代码看起来像:

#!/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
您可能不想用只会使用一次的变量污染环境。如果是这种情况,您可以使用Bash的
declare-p
功能在将变量加载到新环境之前序列化变量,而不是导出它们(在我看来,这是最干净的方法)。下面是它的外观:

export Docker{Port,User} IP Dpath
gnome-terminal -x sh -c 'sshfs -p"$DockerPort" "$DockerUser@$IP":/var/www/html "$Dpath" ; bash'
使用此最新方法,变量仅对运行sshfs命令的shell进程可见,而不是
gnome terminal
本身,也不是此后运行的任何子进程

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

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

将单引号更改为双引号。
for var in IP Docker{Machine,User,Pass,Port}; do 
  read $var
done < ~/.medmadoc
wget -O .dockerid ...
stat=$?