.shファイルの "hash"コマンドを理解するのに問題があります。

.shファイルの "hash"コマンドを理解するのに問題があります。

だから私はLinuxシステムにEtherpad liteをインストールしたいと思います。実行しようとするとエラーが発生します。

"node.jsをインストールしてください(http://nodejs.org)」

このコマンドは、which nodeノードjsへの正しいパスを提供します。それで、Etherpad Liteの.shファイルに行き、次のことを見つけました:

  #Is node installed?
  hash node > /dev/null 2>&1 || { 
  echo "Please install node.js ( http://nodejs.org )" >&2
  exit 1 
}

私の考えでは、これは次のことを意味すると思います。ノードを確認し、使用可能な印刷行がない場合は終了します。しかし、このコードは正確に何をしますか?ハッシングは何をしますか?この金額&はすべてどうなりますか>

誰でもこの3行を私に説明できますか?とても感謝します。

答え1

Bashシェルにコマンドを入力すると、シェルは$ PATH変数全体でそのコマンドを見つけます。ハッシュは単に入力したコマンドとそのコマンドが見つかった場所のインデックスで、次にそのコマンドを見つける速度を上げるのに役立ちます。

メモ: @Anthonの答えハッシュが何であるかについての良い定義を提供します!

たとえば、引数なしでコマンドを実行すると、以前hashに見つかったコマンドのリストとそのコマンドが使用された回数(クリックなど)が表示されます。

% hash
hits    command
   2    /usr/bin/host
   1    /bin/more
   1    /home/saml/bin/autossh_mail.sh
   3    /usr/bin/zip
   2    /bin/rm
   2    /bin/date
   2    /usr/bin/vim
   1    /usr/bin/htop
   2    /bin/mv
   3    /bin/ps
   8    /usr/bin/ssh
   1    /usr/bin/yum
   1    /usr/bin/xfreerdp
   1    /bin/cp
   2    /bin/mkdir
   4    /usr/bin/man
   1    /usr/bin/gvim
   1    /usr/bin/unzip
   1    /usr/bin/w
   5    /usr/bin/nslookup
  51    /bin/ls
  15    /usr/bin/find

このコマンドは、hash node値がハッシュリストに存在するかどうかに応じてステータス値(0または1)を返します。

hash node私のリストにない

% hash node
bash: hash: node: not found
% echo $?
1

メモ:以前に実行したコマンドの状態は、環境変数に一時的に保存されます。$?。各コマンドの実行後に状態(0 =成功、1 =失敗)が配置される場所。

"cmd1" || { "cmd2" ... }構文はorステートメントです。ここで考えて/または論理から始めてください。つまり、最初のタスクを実行し、失敗した場合は2番目のタスクを実行し、それ以外の場合は2番目のタスクを実行しません。

より詳細な例:

% true && echo "1st cmd ret. 1" || echo "1st cmd ret. 0"
1st cmd ret. 1

% false && echo "1st cmd ret. 1" || echo "1st cmd ret. 0"
1st cmd ret. 0

1を返すとコマンドが失敗したことを意味し、0を返すとコマンドが正常に実行されたことを意味するため、論理は常に混乱します(少なくとも私にとっては)。

答え2

以前に投稿した回答に加えて、「2>&1」部分の説明を追加したいと思います。

> /dev/null

出力ファイル記述子(ファイル記述子は、ファイル、パイプ、および端末を読み書きするプロセスで使用される番号です)を/ dev / nullファイルにリダイレクトします。このファイルは、記録されたすべてのコンテンツを読み取るため、システムの「ゴミ箱」です。そしてデータは破棄されます。

2>&1

stderr番号2(無効な出力「ファイル」)ファイル記述子をファイル記述子1にリダイレクトします。これは/dev/nullにリダイレクトされました。つまり、無視されました。

したがって、これらの2つの部分を一緒に使用すると、hashコマンドに出力は表示されません。

答え3

Bashのマニュアルから:

Each time hash is invoked, the full pathname of the command name
is  determined  by searching the directories in $PATH and remembered.  
Any previously-remembered pathname is discarded.

hashbashハッシュテーブルを使用して入力したコマンドのフルパスを検索するbashの内部コマンド。

スクリプトはそれを使用して、nodeパスから実行可能ファイルを検索することを確認します。

答え4

hash nodePATHでnodeという最初のコマンドを検索し、記憶された場所のリストにノードの場所を追加または更新するか、ノードが見つからない場合は1を返します。

次の理由でwhichの代わりにハッシュを使用してください。

  • これはPOSIXでは定義されていません。
  • 一部の環境では、PATHを変更できるcshスクリプトです。
  • たとえば、bashにはハッシュが組み込まれていますが、そうではなく、通常はハッシュが高速です。

コメントで述べたように、問題は、スクリプトの実行時に実際にPATHからノードが欠落していることです。したがって、which node同じ結果が得られます。

関連情報