現在の端末を複製する新しい端末を作成できますか?

現在の端末を複製する新しい端末を作成できますか?

私は/asdf/qwer/dfgh/wert/asdf/qwerディレクトリでコードを開発しており、私のパスに約3つの同様のディレクトリを追加し、いくつかの不明な環境変数を設定したとします。その後、別の端末を開き、同じ方法で設定する必要があることに気づきました。 (必要が再び発生しなかったので、単に.bashrcを変更しました。)これと同じ新しいターミナルウィンドウを開くコマンドはありますか?

答え1

コマンドラインからターミナルプログラムを実行できる場合は、パスを簡単に複製できます。を使用していると仮定すると、複製したい端末のプロンプトで実行xtermできます。xterm &新しい 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このスクリプトには改善の余地があります。

答え2

screen定義された環境(GNU画面)から起動すると、その環境は子screenプロセス(GNU画面など)で使用され、それを使用して新しい端末を作成できます。しかし、再フォークしたい場合(a screenin a screen)、トリッキーになり始めます。

答え3

同様の状況では、現在のシェルと同じディレクトリから新しいシェルを起動することも役に立ちます。私はシェルを始めるためにこのようなレシピを使います。

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

-t オプションは、ssh を使用して明示的にシェルを実行するたびに必要です。プロセスに対して擬似ttyが生成されます。これは、履歴コマンドやその他の対話型機能が正しく機能するために必要です。スクリプトの最初の数行は、DIRを現在のディレクトリに設定し、SHELLをユーザーが好むシェルに設定します。

答え4

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

alias getstate=". ~/environment.tmp"

関連情報