新しいシェルを作成し、新しいシェル(古いシェルではない)で新しいコマンドを実行するスクリプト

新しいシェルを作成し、新しいシェル(古いシェルではない)で新しいコマンドを実行するスクリプト

次のように構成された汎用シェルcshコマンドスクリプトがあります。新しい端末を作成し、後続のコマンドを実行したいと思います。存在する新しいシェルが作成されました。

xterm&;
sourcemyscript.scr;fred;runtool&;

xterm & ;source myscript.scr;ツールの実行&

term1というcsh用語でスクリプトを実行しています。したがって、最初の部分は、新しいターミナルterm2を開き、新しく開いたターミナルterm2で次のいくつかのコマンドを実行することです。その後、元のterm1端末の他の端末も必要になり、この新しい端末で別のコマンドを実行します(例:term3)。

新しいターミナルterm2が作成されましたが、後続のコマンドが新しいターミナルterm2ではなく元のターミナルterm1で実行されることがわかりました。

後続のコマンドが実行のために新しいシェルfofに「移動」されたかどうかを確認する方法を提案しますか?また、戻って新しい端末を実行する必要があることにも注意してください。

答え1

使用:

xterm -e "myscript.scr; cd fred; run _tool" &
xterm -e "source myscript.scr; cd bull; run_tool" &

スイッチは-e指定されたコマンドを実行します以内にxterm代わりに会議後ろにあなたの例はまさにそのことをします。

マニュアルページから:

-eプログラム[パラメータ...]

このオプションは、xtermウィンドウで実行されるプログラム(および対応するコマンドライン引数)を指定します。 -Tと-nがコマンドラインに指定されていない場合、ウィンドウのタイトルとアイコン名もランチャーのデフォルト名に設定されます。これはコマンドラインの最後のオプションでなければなりません。

答え2

私の考えであなたが望むのはこれです。

xterm &
(source myscript.scr; cd fred; run_tool ) & 

この場合、最初のコマンドは現在のシェルセッションで実行され、バックグラウンドにプッシュされます。 2番目のコマンドは、現在のセッションで作成された新しいセッションで実行され、バックグラウンドでも実行されます。

しかし、あなたの質問に「ターミナル」と「シェル」を使って少し混乱しました。新しいインタラクティブターミナルウィンドウをロードしようとしていますか?それとも、現在のシェルセッションに影響を与えずにコマンドを実行しますか?

私のタスクが現在のセッションに影響を与えないようにするために、通常は次のようにします。

for my_dir in $some_list_of_dirs; do
    (
    cd "$my_dir"
    do stuff
    )
done

これにより、作業ディレクトリはプライマリセッションで変更されず、サブセッションでのみ変更され、サブセッションでの環境への変更はプライマリセッションに伝播されません。

関連情報