理解 .sh 文件中的“哈希”命令时出现问题

Yal*_* T. 6 shell bash shell-script

所以我想在 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 
}
Run Code Online (Sandbox Code Playgroud)

我想这意味着:检查节点 --> 如果没有可用的打印行并退出。但是这段代码到底做了什么?哈希有什么作用?所有这些&>?

谁能向我解释这 3 行,将不胜感激?

slm*_*slm 5

当您在 bash shell 中键入命令时,shell 会在整个 $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
Run Code Online (Sandbox Code Playgroud)

该命令hash node返回一个状态值(0 或 1),具体取决于该值是否存在于哈希列表中:

hash node不在我的名单上

% hash node
bash: hash: node: not found
% echo $?
1
Run Code Online (Sandbox Code Playgroud)

注意:任何先前运行的命令的状态都临时存储在环境变量$? 。这是在执行每个命令后放置状态(0 = 成功,1 = 失败)的位置。

构造“cmd1”|| { "cmd2" ... } 是一个 or 语句。在这里思考和/或从逻辑出发。所以这意味着做第一件事,如果失败,那么做第二件事,否则不做第二件事。

一个更详细的例子:

% 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
Run Code Online (Sandbox Code Playgroud)

逻辑总是令人困惑(至少对我来说),因为返回 1 表示命令失败,而返回 0 表示命令运行成功。