Как работает команда tar для установки узла js

10

При установке узла на моем компьютере я использовал следующую команду, которую я нашел на веб-сайте.

tar --strip-components 1 -xzf /usr/save/node-v4.2.1-linux-x64.tar.gz

Я знаю, что tar -xzf используется для извлечения архивов, но я хочу знать, как установить узел?

Я попытался установить его таким образом. Я извлек файлы узлов в /usr/local , используя приведенную ниже команду,

tar /usr/local -xzf /usr/save/node-v4.2.1-linux-x64.tar.gz

Но это не работает. Может ли кто-нибудь объяснить или помочь мне понять разницу между этими двумя командами?

Что еще делает команда 1, чем команда 2?

    
задан prathapa reddy 30.03.2017 в 07:15
источник

2 ответа

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/

Когда вы извлекаете этот архив без каких-либо других опций в /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/

Итак, новый каталог создается в /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/

И /usr/local/bin уже находится в PATH , поэтому вам не нужно ничего делать, чтобы выполнить npm и node .

    
ответ дан muru 30.03.2017 в 07:30
источник
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/

В основном это означает, что при извлечении этого 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

Если вы запустите ls , вы увидите папку node-v4.2.1-linux-x64 .

Теперь --strip-components 1 делает что-то интересное для процесса извлечения. От man tar :

 --strip-components=NUMBER
       strip NUMBER leading components from file names on extraction

В основном это означает, что, когда 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

Если вы запустите 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 . Меньше боли, и он автоматически обновляется для вас.

    
ответ дан Kaz Wolfe 30.03.2017 в 07:29