web-dev-qa-db-ja.com

PATH = $ PATH: `pwd`-このコマンドを実行するとどうなりますか?

このコマンドを実行するとどうなりますか?

PATH =$PATH:`pwd`

エラー:ターミナルでコマンドを実行しても何も起こりません。

5
user831837

質問でコマンドを実行すると、エラーメッセージが表示されます。

$ PATH =$PATH:`pwd`
bash: PATH: command not found

スペースがタイプミスであり、実際にこれを実行する場合:

PATH=$PATH:`pwd`

次に、現在のディレクトリ(pwdは現在のディレクトリのパスを出力するコマンドであり、`pwd`pwdの出力に置き換えられます)を現在のシェルセッションの期間中のPATH変数に追加します(util端末を閉じます)。説明する:

$ pwd
/home/terdon/foo  ## I am in /home/terdon/foo

$ echo $PATH ## the current PATH
/home/terdon/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

$ PATH=$PATH:`pwd`
$ echo $PATH
/home/terdon/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/terdon/foo

現在のディレクトリ/home/terdon/fooPATH変数の最後に追加されていることに注意してください。

16
terdon

エラー

元のコマンドに関する限り、 terdon's answer は、何が起こっているのか、何を起こすべきなのかをすでに十分にカバーしています。それをもう少し詳しく分析してみましょう。

あなたがやろうとしているのは、変数の割り当てです。

varName=value

ただし、スペースがあるため、これはコマンドとして扱われますPATHコマンドライン引数は=で構成され、変数$PATHの内容とpwdのコマンド置換、すべて同じ文字列に参加しました:

PATH =$PATH:`pwd`

もちろん、PATHなどのコマンドはないため、エラーが発生します。

シェルは、単純なコマンドとその引数を、1つ以上のスペースで区切られたトークンのリストとして扱います(おそらく、その前にオプションの変数を割り当てます)。つまり、フォームは次のようになります。

[VAR=value] Word [arg1 [arg2 [arg3] ]...]

もちろん、これはこの場合に望ましいことではありません。

適切なコマンド

それで、するべきことはこれです:

PATH=$PATH:`pwd`    

ここで、適切な変数の割り当てがあります。 展開順序 に従って、bash Shellは最初に変数の展開を実行します。つまり、$PATHをその変数に現在あるもので置き換えます。次に、pwdを実行し、pwdの出力に置き換えるコマンド置換を実行します。最後に、すべてがPATH変数に割り当てられます。

いくつかの重要な観察結果:

  • これは変数の割り当てであるため、$PATH変数を引用符で囲む必要はありませんが、通常は望ましくない動作を避ける必要があります。 二重引用符が必要な場合 を参照してください
  • コマンド置換のバックティック形式は、 現在は推奨されません です。この特定のケースでは問題ありませんが、一般的に、バックティックはネストされたコマンドや複数行のコマンドには適していません。
  • PATH変数は、コマンドを見つけるためにシェルによって使用され、そのリスト上のディレクトリの順序により、コマンドが検索される場所の優先順位が設定されます。したがって、たとえば、コマンドを実行すると、シェルはまずコマンドが built-in であるかどうかを確認し、そうでない場合はPATH変数のすべてのディレクトリを調べます。 PATH=$PATH:$(pwd)は、シェルに他のすべてを走査させ、それからpwdで指定されたディレクトリに到達します。対照的に、PATH=$(pwd):$PATHは、最初にpwdによって返されたディレクトリから検索を開始します。したがって、割り当ての順序が重要です。
2