現在のターミナルのクローンである新しいターミナルを生成できますか?


8

たとえば、ディレクトリ/ asdf / qwer / dfgh / wert / asdf / qwerでコードを開発していて、そのようなディレクトリをさらに3つ追加して、不可解な環境変数を設定したとします。次に、本当に同じ方法で別のターミナルを開いて設定する必要があることに気づきました(ただし、.bashrcを変更するだけなので、この必要は再発しません)。これの正確なクローンである新しいターミナルウィンドウを開くコマンドはありますか?

回答:


10

コマンドラインから端末プログラムを実行できれば、パスの複製は簡単です。を使用していると仮定してxtermxterm &クローンを作成するターミナルのプロンプトから実行します。新しいxtermは、ログインシェルとして起動するように構成されていない限り、同じディレクトリで起動します。エクスポートされた環境変数も引き継がれますが、エクスポートされていない変数は引き継がれません。

環境全体(エクスポートされていない変数を含む)をすばやく簡単に複製する方法は次のとおりです。

# from the old shell:
set >~/environment.tmp

# from the new shell:
. ~/environment.tmp
rm ~/environment.tmp

カスタムシェルオプションを設定している場合は、それらも再適用する必要があります。

このプロセス全体を簡単に実行できるスクリプトにラップできます。スクリプトに環境を既知のファイルに保存してから、を実行しxtermます。.bashrcでそのファイルをチェックし、ファイルを入手して、見つかった場合は削除します。


別の方法として、ある端末を別の端末から起動したくない場合、またはより詳細な制御が必要な場合は、.bashrcで定義する関数のペアを使用できます。

putstate () {
    declare +x >~/environment.tmp
    declare -x >>~/environment.tmp
    echo cd "$PWD" >>~/environment.tmp
}

getstate () {
    . ~/environment.tmp
}

編集putstate他の方法と一致するように、シェル変数の「エクスポートされた」状態をコピーするように変更されました。シェルオプション(を参照help set)など、他にも同様にコピーできるものがあり、このスクリプトには改善の余地があります。


うわー...私が以前に持っていたいくつかの洞察につながるクールな説明。
John Berryman、2011年

引数を取り、環境変数を引数で指定されたファイルに配置して配置するようにスクリプトを変更しました...これで、いくつかの環境を作成できます!:D
ジョンベリーマン

質問:「。」の意味 getstateで行う?
John Berryman

「。」「コマンドラインで入力したかのように、現在のシェルを使用してこのファイルの内容を実行します」と言います。「。」がないと、の新しいコピーはbashファイル内のコマンドを実行してから終了し、現在のシェルの環境は変更されません。
Jander

0

screen定義した環境で(GNUスクリーン)を起動すると、その環境はサブプロセス(つまりscreen)によって使用され、それを使用して新しい端末を生成できます。しかし、もう一度フォークしたい場合は(a screenscreen)、トリッキーになります。


0

同様の状況で、現在のシェルと同じディレクトリで新しいシェルを起動することも役立つことがわかりました。私はこのようなレシピを使ってシェルを起動しました。

exec ssh -t $HOST "cd $DIR; $SHELL $parms"

sshを使用してシェルを明示的に実行する場合は常に-tオプションが必要です。プロセスの疑似ttyが作成されます。これは、履歴コマンドやその他のインタラクティブ機能が正しく機能するために必要です。スクリプトの以前の行では、DIRを現在のディレクトリに設定し、SHELLをユーザーの優先シェルに設定しています。


0

エクスポートされた変数は、上記の「getstate」関数を使用して反対側に移動しますが、何らかの理由でそれらはそこにエクスポートされません(Pythonの単純なos.getenvを使用して確認できます)。getstateをエイリアスに変更すると、うまくいくようです:

alias getstate=". ~/environment.tmp"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.