私はシェルスクリプトの初心者です。スクリプトを使用して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
問題は新しい端末を開くことですが、2番目の端末の場合は最初の端末を閉じる必要があります。次の端末を開くために古い端末を閉じないようにするにはどうすればよいですか?
完全なコード
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
最初に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
これはシェルではありません。ディスク上の実際の実行可能ファイルの内容のみを実行できます。source
Bourneスタイルのシェルの内部コマンドなので、実行可能ファイルとして存在しません。
スクリプトはxterm内のインスタンスopenapps.sh
から提供されますが、/ etcbash
コマンドはソースが必ずしも必要ではない他のシェルインスタンスから関数を呼び出そうとするため、そのコマンドは失敗する可能性があります。opensublime
openspark
openapps.sh
openapps.sh
だからxterm
シェルを実行する必要があります新しいxtermウィンドウで、指定されたコマンドラインを使用します。xterm -e bash -c "<commands>"
この方法。
その関数を他の関数と一緒に使用するには、その関数を提供するopensublime
同じシェルでこれらの関数を実行する必要があります。そうしないと、エラーメッセージがopenapps.sh
生成される可能性があります。command not found
これが、これらのコマンドを二重引用符の中に入れなければならない理由です。
ulimit
設定と環境変数は、親プロセスからビシェル子プロセス(この場合)を介して孫プロセス(で実行中)に伝播できexport
ますが、シェル機能はこのように伝播されません。xterm
bash
xterm