使用 bash 安装脚本时,Debian PATH 行为和“which”结果令人困惑

使用 bash 安装脚本时,Debian PATH 行为和“which”结果令人困惑

我安装了 Raspbian Jessie,它附带了 node v0.X,这是 Raspbian 存储库中可用的最新版本的 node。所以我编写了一个安装 v6.7.0 的脚本:

#!/bin/bash
sudo apt-get remove nodejs node
if [ ! $(command -v node) ]; then
  mkdir -p ~/tmp
  pushd ~/tmp
  if [ ! -d node-v6.7.0-linux-armv6l ]; then
    if [ ! -f node-v6.7.0-linux-armv6l.tar.xz ]; then
      wget https://nodejs.org/dist/v6.7.0/node-v6.7.0-linux-armv6l.tar.xz
    fi
    tar -xJf node-v6.7.0-linux-armv6l.tar.xz
  fi
  cp -R node-v6.7.0-linux-armv6l/* /usr/local/
  popd
fi

但是当我跑步时node -v我得到了这个:

-bash:/usr/bin/node:没有此文件或目录

当我运行时,which node我没有得到任何输出。 - 并且脚本从未执行if分支,因此不会下载节点并且不会放入任何内容/usr/local

如果我使用 aptitude 卸载了 nodejs,为什么它仍然在查找/usr/bin/node

我检查了PATH变量,它同时具有/usr/local/bin/usr/local/sbin

我如何修改脚本以使其按预期工作?

答案1

可能存在指向某个缺失文件的符号链接 /usr/bin/node。使用 检查ls -alp /usr/bin/node。/etc/alternatives 等可能有问题。

您无需删除任何使用 apt 安装的包来安装新版本的 Node。

如果您想以可行的方式安装 Node,请参阅我的教程:

顺便说一下,它解释了如何正确安装 Node 6.7.0 - 只需将版本更改为您需要的版本即可。

不要使用您已有的脚本 - 它可能因多种原因而失败 - 例如,当您在 /tmp 中拥有 node-v6.7.0-linux-armv6l 时,或者如果您在 /tmp 中已经有 node-v6.7.0-linux-armv6l.tar.xz,或者如果您在 /usr/bin 中有一个符号链接等。请按照我在二进制包教程中描述的方式手动执行。只需将文件名更改为您需要的版本 - 例如,如果您想要 ARM 的 6.7.0,则为 node-v6.7.0-linux-armv6l.tar.gz。

答案2

问题可能是 bash 之前运行过它,因此其缓存中有一个哈希版本。你可以阅读更多相关信息这里

您可以通过运行来确认

type node

如果你看到类似

node is hashed (/usr/bin/node)

那么这确实是问题所在。

你可以使用以下命令清除所有哈希hash -r,或者只清除这一个哈希hash -d node

顺便说一句,这which实际上是为编写的工具csh,在极端情况下,它无法按预期工作bash。考虑使用type -pcommand -v查找位置,bash并获得关于它的真正出色的写作这里

相关内容