古い端末を閉じずにシェルスクリプトを使用して複数の端末を開く

古い端末を閉じずにシェルスクリプトを使用して複数の端末を開く

私はシェルスクリプトの初心者です。スクリプトを使用して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これはシェルではありません。ディスク上の実際の実行可能ファイルの内容のみを実行できます。sourceBourneスタイルのシェルの内部コマンドなので、実行可能ファイルとして存在しません。

スクリプトはxterm内のインスタンスopenapps.shから提供されますが、/ etcbashコマンドはソースが必ずしも必要ではない他のシェルインスタンスから関数を呼び出そうとするため、そのコマンドは失敗する可能性があります。opensublimeopensparkopenapps.shopenapps.sh

だからxtermシェルを実行する必要があります新しいxtermウィンドウで、指定されたコマンドラインを使用します。xterm -e bash -c "<commands>"この方法。

その関数を他の関数と一緒に使用するには、その関数を提供するopensublime 同じシェルでこれらの関数を実行する必要があります。そうしないと、エラーメッセージがopenapps.sh生成される可能性があります。command not foundこれが、これらのコマンドを二重引用符の中に入れなければならない理由です。

ulimit設定と環境変数は、親プロセスからビシェル子プロセス(この場合)を介して孫プロセス(で実行中)に伝播できexportますが、シェル機能はこのように伝播されません。xtermbashxterm

おすすめ記事