我是 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 运行一个bash
shell,该 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
脚本源自bash
xterm 内的 实例,但命令opensublime
/openspark
等正在尝试调用不同 shell 实例中的函数openapps.sh
,该实例不一定具有 source openapps.sh
,因此这些命令可能会失败。
所以,你需要xterm
运行一个 shell在新的 xterm 窗口中,使用指定的命令行。xterm -e bash -c "<commands>"
这样做。
如果您想使用您的opensublime
函数和其他函数,则需要在提供您的函数的同一 shell 中运行这些函数openapps.sh
,否则它们可能只会产生command not found
错误消息。这就是为什么这些命令需要移到双引号内。
ulimit
设置和export
ed 环境变量可以从父进程通过非 shell 子进程(xterm
在本例中)传播到孙进程(bash
在 中运行xterm
),但 shell 函数不会以这种方式传递;他们需要重新加载。