変数を新しいLinuxシェルに複製する方法は?


1

その特定のシェルに設定されているすべての環境変数で現在のシェルのレプリカを作成する方法はありますか?

私は、変数を初期化してきたシェルを考えてみましょうvar1var2var3。理想的には、変数値は新しいシェル(たとえば、ターミナルエミュレータの別の(新鮮な)タブのシェル)には認識されません。そこで設定された変数に関して、現在のシェルのレプリカを作成したいと思います。それは可能ですか?


はい、正確に !新しいタブによって、私が意味することは、新たな(シェル- > [新規作成]タブ)であるからiTerm、私が使用しているが...
RM -rf星

回答:


4

Bashの変数のみに関する場合(質問にはというタグが付けられています)、UbuntuのAskの回答が出発点として適しています。

declare組み込みのすべての変数を見ることができます。

declare -p

環境変数のみに関心がある場合は、使用します

declare -xp

実行help declareして、他のオプションを確認します。

出力にはソースとなる正しい構文が含まれているため、次のソリューションが登場します。

  1. ソースBashセッションで実行

    declare -p > ~/some_file
  2. ターゲットBashセッションで実行

    . ~/some_file 2>/dev/null

ノート:

  • 一部の変数(などPPID、またはでマークされた変数declare -r)は読み取り専用であり、を使用せずにターゲットセッションで変数を設定しようとした場合、警告はほとんど表示されません2>/dev/null。このリダイレクトは、そのような警告を抑制するためだけにあります。ターゲットセッションで読み取り専用だった変数はそのまま残ります。
  • ターゲットセッションとファイルに存在するほぼすべての変数は、ファイルの値で上書きされます。例外は次のとおりです。
    • ターゲットシェルですでに読み取り専用としてマークされている変数。
    • GROUPSまたはのようなRANDOM特別な変数(詳細man 1 bashについては参照); 私の知る限り、declare -pそれらを異なる方法で処理するため、ターゲットシェルで特別なままになります。
  • ターゲットセッションには存在したがファイルには存在しなかった変数は、そのまま残ります。

    ターゲットシェル内の(ほぼ)できるだけ多くの「古い」変数を削除するには、ファイルをソースする前に次のコマンドを使用します。

    exec env -i bash --noprofile --norc

    これは始まりbashでもない、起動や初期化ファイルを(読み込む--noprofile --norc(空の環境で)env -i)。さらに、新しいプロセスはbash現在のシェル(exec)を置き換えるため、2つのプロセスが不必要にスタックすることはありません(前提は、現在のターゲットシェルはとにかく消耗品であるということです)。

    実際、新しいbashコマンドを開始して、1つのコマンドでファイルをソースにすることができます。

    exec env -i bash --noprofile --rcfile ~/some_file

そのため、一般的に、ターゲットセッションは正確なレプリカにはなりません。それでも、ソースセッションで手動で設定した変数を転送するだけでよい場合は、この方法で十分です。


1
簡単な方法があり、未作成宣言していたファイルで-set変数は?または、最初にすべての変数を設定解除します(または、おそらくいくつかのことを壊します...)?
Xen2050

適切なコミュニティに私を誘導してくれてありがとう:) ここで何2/dev/null参照しますか?出力を2から/ dev / nullに書き込んでいると推測できますが、各用語が何を指しているのか理解できませんか?説明してもらえますか?
rm -rf star

1
@ rm-rfstar 2>/dev/nullは別の主題であり、かなり広い主題です。回答またはコメントは明確な詳細を説明するためのものではないため、元の問題に焦点を当てて回答を続けます。独自の調査を行ってください(ヒント:「シェルリダイレクト」はグーグルを始めるのに良いフレーズです)。その後、まだ不明な点がある場合は、スーパーユーザーに別の質問をしてください。
カミルマシオロウスキ

@ Xen2050 exec env -i bash --noprofile --norc–(編集済み)回答で説明されています。
カミルマシオロウスキ

すばらしい答えです!トン男ありがとう!@KamilMaciorowski :)
rm -rf star
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.