Как JBallin и Stéphane Chazelas указали, что в оболочках POSIX поиск несуществующего файла приведет к сбою входа в систему.
Но добавление теста, чтобы увидеть, существует ли файл, а затем попытка получить его источник, может привести к тому, что называется состоянием гонки. Если что-то изменится nvm.sh
между [ -s nvm.sh ]
и . nvm.sh
, это вызовет именно ту ошибку, которую они пытаются предотвратить, хотя и намного реже.
В общем, способ предотвратить состояние гонки состоит в том, чтобы просто попробовать то, что вы хотите сделать, а затем обработать ошибку, если она не удалась, например.
. "$NVM_DIR/nvm.sh" || echo "Sourcing $NVM_DIR/nvm.sh failed" >&2
Оказывается, это не работает в оболочках POSIX, потому что, как указано выше, .
сбой приведет к немедленному завершению работы оболочки до того, как будет запущена какая-либо обработка ошибок.
Мой ответ утверждает, что оболочки POSIX не имеют отношения к этому вопросу, потому что .bash_profile
никогда не должны работать в режиме POSIX. Так что в любом случае мы можем просто выполнить приведенный выше код.
В целях безопасности мы могли бы убедиться, что режим POSIX не действует, или убедиться, что режим POSIX отключен, используя метод, описанный вhttps://unix.stackexchange.com/a/383581/3169.
В ответе Стефана есть несколько полезных советов о том, как обрабатывать все оболочки POSIX, что, я думаю, было намерением автора nvm, но немного отличалось от того, что задавал здесь вопрос, поэтому у нас есть несколько возможных подходов, в зависимости от того, что ваша цель.