使用 shell 脚本打开多个终端但不关闭前一个终端

使用 shell 脚本打开多个终端但不关闭前一个终端

我是 shell 脚本编写的初学者。我正在尝试使用脚本打开 4 个终端。这是代码

for i in 1 2 3 4
do
    echo $i
    if [ $i -eq 1 ]; then
        # xterm -e 
        xterm -e "source /home/akshay/openapps.sh; bash"
        opensublime
    elif [ $i -eq 2 ]; then
        xterm -e "source /home/akshay/openapps.sh; bash"
        openspark
    elif [ $i -eq 3 ]; then
        xterm -e "source /home/akshay/openapps.sh; bash"
        openpycharm
    elif [ $i -eq 4 ]; then
        xterm -e "source /home/akshay/openapps.sh; bash"
        runproject 8000
    fi

done

问题是它正在打开一个新终端,但对于第二个终端,我需要关闭第一个终端。我如何避免关闭前一个终端以打开下一个终端。

完整代码

dpkg -s xterm  &> /dev/null
echo "Checking for Xterm"
if [ $? -eq 0 ]; then
    echo "Package  is installed!"
else
    echo "Package is not installed. Now installing package"
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install xterm
    echo "Package  is NOW installed!"
fi

for i in 1 2 3 4
    do
        echo $i
        if [ $i -eq 1 ]; then
            xterm -e "source /home/akshay/openapps.sh; bash" &
            opensublime
        elif [ $i -eq 2 ]; then
            xterm -e "source /home/akshay/openapps.sh; bash" &
            openspark
        elif [ $i -eq 3 ]; then
            xterm -e "source /home/akshay/openapps.sh; bash" &
            openpycharm
        elif [ $i -eq 4 ]; then
            xterm -e "source /home/akshay/openapps.sh; bash" &
            runproject 8000
        fi
    done

openapps.sh

function opensublime() {
  cd "/opt/Sublime Text 2"
  eval "./sublime_text"
  cd 
}
function openpycharm() {
  cd "/home/akshay/Documents/pycharm-community-2018.1.4/bin"
  eval "./pycharm.sh"
  cd 
}
function openspark(){
  cd "/opt/Spark/"
  eval "./Spark"
  cd 
}
function runproject(){
  cd "wr_workspace/corporate_admin/"
  eval "source ../env/bin/activate"
  echo "starting server on port $1"
  eval  "python manage.py runserver 127.0.0.1:$1"
  deactivate
  cd
}

答案1

如果您希望脚本不等待命令执行结束就继续执行下一个命令,请添加&到命令行末尾。

另外,如果您想每次在循环中执行不同的操作,则不需要循环。只需按顺序列出您想要做的事情即可。

在评论中反复讨论之后,我知道您希望 xterm 运行一个bashshell,该 shell 应首先获取您的openapps.sh脚本,然后执行脚本中定义的函数。所以这样的事情应该有效:

xterm -e bash -c "source /home/akshay/openapps.sh; opensublime; bash" &
xterm -e bash -c "source /home/akshay/openapps.sh; openspark; bash" &
xterm -e bash -c "source /home/akshay/openapps.sh; openpycharm; bash" &
xterm -e bash -c "source /home/akshay/openapps.sh; runproject 8000; bash" &

我不确定这; bash部分是否真的必要,但我保留它以防万一。

您原来的命令有一些问题:

xterm -e "source /home/akshay/openapps.sh; bash" 
opensublime

这告诉 xterm 执行命令行source /home/akshay/openapps.sh; bash。但xterm它不是 shell:它只能执行磁盘上实际可执行文件的内容。source是 Bourne 风格 shell 中的内部命令,因此它不作为可执行文件存在。

openapps.sh脚本源自bashxterm 内的 实例,但命令opensublime/openspark等正在尝试调用不同 shell 实例中的函数openapps.sh,该实例不一定具有 source openapps.sh,因此这些命令可能会失败。

所以,你需要xterm运行一个 shell在新的 xterm 窗口中,使用指定的命令行。xterm -e bash -c "<commands>"这样做。

如果您想使用您的opensublime 函数和其他函数,则需要在提供您的函数的同一 shell 中运行这些函数openapps.sh,否则它们可能只会产生command not found错误消息。这就是为什么这些命令需要移到双引号内。

ulimit设置和exported 环境变量可以从父进程通过非 shell 子进程(xterm在本例中)传播到孙进程(bash在 中运行xterm),但 shell 函数不会以这种方式传递;他们需要重新加载。

相关内容