tar 命令如何安装 Node js

pra*_*ddy 10 tar software-installation

在我的机器上安装 Node 时,我使用了在网站上找到的以下命令。

tar --strip-components 1 -xzf /usr/save/node-v4.2.1-linux-x64.tar.gz
Run Code Online (Sandbox Code Playgroud)

我知道它tar -xzf用于提取档案,但我想知道节点是如何安装的?

我尝试以这种方式安装它。我已经/usr/local使用以下命令提取了节点文件,

tar /usr/local -xzf /usr/save/node-v4.2.1-linux-x64.tar.gz
Run Code Online (Sandbox Code Playgroud)

但这不起作用。有人可以解释或帮助我理解这两个命令之间的区别吗?

命令 1 所做的比命令 2 所做的更多吗?

mur*_*uru 24

tarball 目录结构是这样的:

$ tar tf node-v6.10.1-linux-x64.tar.xz | head
node-v6.10.1-linux-x64/
node-v6.10.1-linux-x64/bin/
node-v6.10.1-linux-x64/bin/npm
node-v6.10.1-linux-x64/bin/node
node-v6.10.1-linux-x64/share/
node-v6.10.1-linux-x64/share/man/
node-v6.10.1-linux-x64/share/man/man1/
node-v6.10.1-linux-x64/share/man/man1/node.1
node-v6.10.1-linux-x64/share/systemtap/
node-v6.10.1-linux-x64/share/systemtap/tapset/
Run Code Online (Sandbox Code Playgroud)

当您在没有任何其他选项的情况下提取此存档时/usr/local,您会得到:

/usr/local/node-v6.10.1-linux-x64/
/usr/local/node-v6.10.1-linux-x64/bin/
/usr/local/node-v6.10.1-linux-x64/bin/npm
/usr/local/node-v6.10.1-linux-x64/bin/node
/usr/local/node-v6.10.1-linux-x64/share/
/usr/local/node-v6.10.1-linux-x64/share/man/
/usr/local/node-v6.10.1-linux-x64/share/man/man1/
/usr/local/node-v6.10.1-linux-x64/share/man/man1/node.1
/usr/local/node-v6.10.1-linux-x64/share/systemtap/
/usr/local/node-v6.10.1-linux-x64/share/systemtap/tapset/
Run Code Online (Sandbox Code Playgroud)

因此,在 中创建了一个新目录/usr/local,并将文件转储到那里。

但是,使用--strip-components=1,从提取的路径中删除一个目录组件,因此node-v6.10.1-linux-x64/bin/变为bin/node-v6.10.1-linux-x64/bin/npm变为bin/npm

/usr/local/
/usr/local/bin/
/usr/local/bin/npm
/usr/local/bin/node
/usr/local/share/
/usr/local/share/man/
/usr/local/share/man/man1/
/usr/local/share/man/man1/node.1
/usr/local/share/systemtap/
/usr/local/share/systemtap/tapset/
Run Code Online (Sandbox Code Playgroud)

并且/usr/local/bin已经在 中PATH,因此您无需执行任何其他操作即可执行npmnode


Kaz*_*lfe 14

这是安装 NodeJS 的一种很酷(但很烦人)的方式。

如果您运行tar tf /usr/save/node-v4.2.1-linux-x64.tar.gz该文件,您将看到如下内容:

node-v4.2.1-linux-x64/
node-v4.2.1-linux-x64/bin/
node-v4.2.1-linux-x64/bin/npm
node-v4.2.1-linux-x64/bin/node
node-v4.2.1-linux-x64/share/
node-v4.2.1-linux-x64/share/man/
node-v4.2.1-linux-x64/share/man/man1/
Run Code Online (Sandbox Code Playgroud)

基本上,这意味着当您解压缩此 tar 存档时,它将解压缩到一个文件夹,node-v4.2.1-linux-x64其中包含所有这些子文件夹(和节点安装)。事实上,您甚至可以尝试这种提取以获得更好的主意:

mkdir /tmp/node
cd /tmp/node
tar xvf /usr/save/node-v4.2.1-linux-x64.tar.gz
Run Code Online (Sandbox Code Playgroud)

如果你运行ls,你会看到一个node-v4.2.1-linux-x64文件夹。

现在,--strip-components 1对提取过程做了一些有趣的事情。来自man tar

 --strip-components=NUMBER
       strip NUMBER leading components from file names on extraction
Run Code Online (Sandbox Code Playgroud)

基本上,这意味着当tar要提取您的存档时,它会假装node-v4.2.1-linux-x64文件夹不存在。相反,它会提取物bin/share/和所有直接的其他文件夹。

其实你可以试试:

mkdir /tmp/node
cd /tmp/node
tar xvf /usr/save/node-v4.2.1-linux-x64.tar.gz --strip-components=1
Run Code Online (Sandbox Code Playgroud)

如果您运行ls,您将看到不再有node-v4.2.1-linux-x64文件夹。它只是bin/, include/, lib/, 和share/(所有巧合的文件夹/usr/local/)。

您的第二个命令将不起作用,因为它只是将node-v4.2.1-linux-x64文件夹解压缩到/usr/local(如果它甚至运行)。如果您运行ls /usr/local,您甚至可能会看到此文件夹四处闲逛。没用,随意删除rm。至于为什么没用,请继续阅读......


现在我们已经解释了 tar 命令的工作原理,我们可以解释它是如何安装的。

每个 Linux 系统都有一个叫做$PATH变量的东西,它决定了可执行文件的存储位置。在这些地方是/usr/local/bin。当您在/usr/local其中提取该二进制文件时(我相信这是您的安装说明所说的内容),NodeJS 二进制文件将/usr/local/bin/node根据提取的完成方式写入。同样,所有的库都被添加到本地库文件夹中,几乎所有东西都在它所属的地方。

现在,警告(以及为什么这很烦人)是apt不会看到、理解或意识到发生了什么。您将无法通过sudo apt upgrade或类似方式更新它。您需要手动进入并清理旧的 NodeJS 安装,然后安装新的,以防您想升级。

我建议你直接跑sudo apt install nodejs-legacy。减少痛苦,它会自动为您更新。