export PATH = something:$ PATHはどういう意味ですか?


27

私はLinuxを初めて使用.profileし、ホームフォルダーの下のファイルの最後に次のコマンドを配置します。

export PATH="~/.composer/vendor/bin:$PATH"

私は環境変数とその値の問題をWindowsから少し知っていますが、この場合、このコマンドが何をするのか、そしてそれが何を構成するのかを理解したいと思います。

  1. 最初のこの「エクスポート」フレーズは何ですか?Bashで使用できるようにデータをエクスポートしていますか?

  2. 最初は何であるPATHと第二もので$PATHあり、我々は2を、なぜ必要なのですか?


:OSの間のいくつかの技術的な違いはさておき、それはWindows上でこのプロセスと同等だwindowsitpro.com/systems-management/...
2ビットの錬金術

1
「エクスポート」は、bashによって起動された新しいプログラムに変更を表示します。
ソルビョーンラウンアンデルセン

1
@ThorbjørnRavnAndersen:いいえ、変数を既にエクスポート済みとしてマークしているexportため、コマンドを使用するかどうかに関係なく発生しますPATH。(あなたは私を信じていない場合は、両方の方法をお試しください!)
デヴィッド・

回答:


39

最初のこの「エクスポート」フレーズは何ですか?

exportはコマンドです(より正確には、BashPATHビルトインです。つまり、に存在する実行可能ファイルではありません。Bash自体にビルトインされているコマンドです)。

Bashで使用できるようにデータをエクスポートしていますか?

export割り当ての左側の環境変数を、割り当ての右側の値に設定します。そのような環境変数は、それを設定するプロセスと、同じ環境で生成されたすべてのサブプロセス、つまり、この場合~/.profile、同じ環境で生成されたすべてのサブプロセス(たとえば、他のシェルを含む、順番にアクセスできるようになります)。

最初は何であるPATHと第二もので$PATHあり、我々は2を、なぜ必要なのですか?

最初PATHに説明したのは、を使用して設定する環境変数ですexport

PATH通常、~/.profileソースのときに何かが含まれているため(デフォルトではが含まれています/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games)、単にに設定PATHするだけで~/.composer/vendor/binPATH含むようになります~/.composer/vendor/bin

だから、以降のコマンドで変数への参照に置き換えられます(またはそれに「拡大」)、コマンドの評価時にバッシュすることにより、変数の値を:$PATHに割り当てられる値の最後に置かれるPATHようにPATH含む終わります~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games(すなわち、最初PATHにすでにプラス~/.composer/vendor/bin:を含むもの)。


素晴らしい説明。
チョイルトンB.ヒギンボトム

16

https://help.ubuntu.com/community/EnvironmentVariablesが役立つでしょう。また、それman bashがどのように機能するかを理解するのに非常に役立つかもしれません(少なくともBashでは)

とにかく- PATH=あなたは基本的にPATH変数を設定し、いくつかの新しいパスを検索に追加し、既に/以前に設定したパスを最後に追加します$PATH(これは基本的にPATH変数への参照です)。

だから、あなたPATHは今までのようなものに設定されていたと言います:

PATH="x:y:z"

そして、あなたは設定します

PATH="a:b:c:$PATH"

あなたのPATHその後は次のようになります:

a:b:c:x:y:z

それが理にかなっていることを願っています。

さらに、新しい変数をエクスポートして、環境内で子プロセス/サブシェルも含むようにします。

また、設定されたディレクトリの順序PATHが重要になる場合があることにも注意してください。そして、次のようなPATH="$PATH:a:b:c"結果が得られます:

x:y:z:a:b:c

これは、コマンドの検索中にディレクトリ/パスの順序に影響します(コマンドが複数のディレクトリにある場合、最初に見つかったものが使用されます-予期しない結果が得られる場合があります)。


2

ここにコマンドがありますので、誰もが弾丸のポイントを通り抜けることができます。 export PATH="~/.composer/vendor/bin:$PATH"

  • exportshell built-in(つまりシェルではない/bin/exportことを意味する)コマンドは、基本的にbash(Extra Readingのリンクされた質問を参照)およびサブシェルから呼び出される他のプログラムで環境変数を利用できるようにします。
  • シェルでの割り当ては最初に展開され、次に割り当てが行われます。したがって、二重引用符の中にあるものは最初に展開され、PATH後で変数に保存されます。
  • $PATHはデフォルトのPATH割り当て(または少なくとも、このコマンドが.bashrcorに表示されるまで変数がどのように見えるか.profile)であり、それを展開します。
  • ~/.composer/vendor/binは、に展開されます。/home/username/.composer/vendor/binここで.composerは、先頭のドットのために隠しフォルダーがあります。
  • このショート~/.composer/vendor/bin:$PATHは、で区切られた長いフォルダーのリストに変わりました:。パスにスペースを含むフォルダーを含めるために、すべてを二重引用符で囲みます。
  • 最後に、すべてがPATH変数に保存され、外部コマンドがそれを使用することを許可されます

簡単な例

私の対話型シェルは実際にmkshはで、たまたまexportビルトインされています。exportset を使用することによりVAR、同じ変数をエクスポートしたコマンド/サブプロセスの後続のチェーンに変数を渡すことができます。

$ echo $SHELL            
/bin/mksh
$ VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR' 
$ export VAR="HelloAskUbuntu"                                                  
$ bash -c 'echo $VAR'                                                          
HelloAskUbuntu
$ 

余分な読書


3
いいえ、~in ~/.composer/vendor/binは展開されません!チルダは、=記号の直後など、いくつかの特別な場所でのみ展開されます。PATH="~/.foo:$PATH"結果はになり~/.foo:/other/path/dirs...ます。しかし、で~拡張されPATH=~"/.foo:$PATH"、その結果がになり/home/user/.foo:/other/path/dirs...ます。
フォルカーシーゲル

2

私はここを読んで、ウェブの他の場所でこれについて友人と話し、新入生として(おそらくUbuntuの新入生の方がここにいると思うかもしれません)、このコマンドをマップする必要があると決めました-マップを作成し、したがって、それがどうなっているのか、どこにあるのかを学びます。

予備データ

今のところ、この章で何かを理解していなくても、心配しないで、読み続けるとわかりやすくなりますが、この問題を理解するには、環境変数(EV)、その値、および目的を読む必要があります。私は今、私のような新人のために、そして新人のためだけに、コマンドを簡単な言葉とマッピングの方法で説明しようとします。ここでベストを尽くそうとしました...

マッピング

export PATH="~/.composer/vendor/bin:$PATH"

Ubuntu 15.10に付属するEV「PATH」の元の値は次のとおりです。

/usr/bin:/usr/sbin

コマンド自体に、2つのPATHフレーズがあることに注意してください。最後は$ PATHです-$は「元の値または隣のEVの値を出力します」と表示します。その隣のEVはPATH EVです。

パス変数自体をエクスポートしました(サブプロセス、実際にはBashシェルではなく、その内部で実行されるCLIで実行されるIEプロセス(Drupal CLI であるDrushなど)で使用できるようにしました)。

エクスポートに加えて、それも拡張しました。最初のPATH句(PATH =)を使用して、元の値($ PATHで表される)に追加の値(〜/ .composer / vendor / bin :)を追加しました。

  • 上記の段落で説明した新しい値の最後のコロン(:)は、新しい値を元の値と区別するために使用します。

  • 「」は、値が存在する領域です。

  • 〜はホームフォルダーです。


私がこのマッピングを行った後、私のような新入生にとってコマンドがより明確になることを願っています。


1

このexportコマンドは、変数をサブシェルで使用可能にします。つまり、それなしでは、変数PATHはサブシェルで表示されません。

PATH 二回言及されています:

  • 変数として、値が割り当てられている、=記号の左側。
  • =記号の右側の値で置き換えられる変数名として。これにより、古い値が新しい値の一部になります。

1
「それがないと、変数PATHはサブシェルに表示されません。」これは間違っています。PATH環境変数(シェル変数とまったく同じではない)であるため、自動的にエクスポートされ、exportコマンドは不要です。
デビッド

Bourneシェルファミリは、シェル変数と環境変数を実際に区別しません。(sc.tamu.edu/help/general/unix/vars.html)私のシステム(Arch Linux)では、bashはsetenvコマンドさえも知りません。
-rexkogitans

1
カーネルが知っている環境変数と、bashの内部にあるシェル変数にはまだ違いがあります。以来PATH、あなたが実行する必要はありませんので、環境に由来し、それが自動的に、エクスポートされexportた子プロセス(リンク先のページが言うに反して)に伝播される変更のため。
デビッド

環境変数はカーネルのプロパティではなく、プロセスのプロパティです。ここで説明しているプロセスはsh、bash(Ubuntuはzshを使用していますか?)なので、シェル変数と同じにしておくことができると思います。しかし、もちろん、シェル変数は環境変数とは異なり、ランダムプログラムに渡されません。
-rexkogitans

私たちはこの時点でセマンティクスに行き詰まっていると思います。私が言おうとしていたことは、bashでPATH=fooそれexport PATH=fooと同じ動作をすることだけでした。
デビッド

0
export PATH="~/.composer/vendor/bin:$PATH"
  1. これexportはbashのbuildinコマンドで、環境変数になるエクスポート変数を意味します。(help exportもっと傾くように入力できます

    (コマンドに続く文字はスペースで分割されたパラメーターメーターであるため、この場合、パラメーターは1つだけです)

  2. これPATHは変数名であり、通常、bashによって事前定義された変数で、大文字で命名されます。

  3. =この変数に割り当てる値を意味します。

  4. すべての文字列は、変数の値です

  5. これ$PATHは、bashの一種のvariable expantion関数であり、bashはPATHパラメータ文字列に存在する値を置き換えます。BEFOREは文字列をexportコマンドに送信する前に

  6. :PATH変数にspcial文字でこの変数を使用するすべてのアプリケーションによってunderstooded。セパレーターを意味します。そのため、PATH変数に多くのディレクトリがあります。

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