2016-10-20 4 views
2

В NVM README.markdown он говоритЧто такое исходная функция оболочки?

Пожалуйста, обратите внимание, что which nvm не будет работать, так как nvm является соерсед оболочки функция, а не исполняемый двоичный файл.

То, что я нашел это NVM процесс установки будет обновлять .bashrc с

[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm 

Каким-то образом это делает nvm команду доступной для оболочки. Мой вопрос в том, что такое «исходная функция оболочки» и что именно выполняет команда nvm?

+0

Если вы хотите знать, что делает функция с именем 'nvm', запустите' type nvm', чтобы напечатать свой текст после того, как он был определен –

+0

BTW, я предполагаю в своем ответе, что вы знаете, что такое функция оболочки вообще , В настоящее время вопрос не дает понять, является ли это предположение обоснованным. –

+0

Кроме того: если bash-специфичный, 'nvm.sh' неверно назван и должен быть вместо него' nvm.bash'; при использовании '.sh' в общем случае [весьма неудачно в лучшие времена] (https://www.talisman.org/~erlkonig/documents/commandname-extensions-considered-harmful/), это совершенно вредно, когда это ложно подразумевает совместимость с другими оболочками POSIX - ksh, dash, ash и т. д. - для сценария, который, не будучи вызванным через shebang, не может указать собственный интерпретатор. –

ответ

3

Это слово неаккуратно. nvm - это просто функция оболочки, определяемая путем поиска файла, в котором эта функция определена. Это не меняет функцию каким-либо качественным образом: это была бы одна и та же функция со всеми одинаковыми поведением, если бы вы набрали ее вручную, поэтому применение «источника» в качестве модификатора немного вводит в заблуждение; было бы точнее сказать, что nvm.sh - это сценарий источника, который определяет функцию оболочки с именем nvm.


Что касается конкретного синтаксиса:

. somefile 

является более портативным способом написать

source somefile 

... который выполняет действия в somefileв текущей оболочке, в отличие от отдельной оболочки, выполняемой как подпроцесс.

Таким образом, поиск сценария может изменить ваш текущий интерпретатор, установив переменные, изменив его рабочий каталог и, да, определяя псевдонимы и функции - способами, которые не выполняются внешней программой.


Для уточнения: Если вы запускали bash somefile, то все функции, определенные somefile существуют только в течение этого конкретного экземпляра bash - когда он вышел и вернулся вас в строку, функция, определенная в somefile бы не дольше быть доступным. В отличие от этого, когда вы source somefile, потому что содержимое somefile выполнено в вашем текущем экземпляре оболочки, это содержимое может сохраняться.

+0

Спасибо, очень хорошо объяснил.Я обнаружил, что у nvm.sh есть функция внутри него, называемая nvm. Я не знал, что вы можете сделать функции из исходного файла доступными как команды для оболочки. – user3885927

+0

Эффект поиска скрипта * почти * идентичен эффекту ввода каждой команды в нее в вашу интерактивную оболочку вручную. Таким образом, если вы можете определить функцию, введя ее в свою командную строку, вы можете определить эту функцию путем поиска сценария, который содержит его определение. –

+0

Имеет смысл, чувствую себя смущенным, что мне не приходило в голову :( – user3885927

 Смежные вопросы

  • Нет связанных вопросов^_^