Источник сценария bash: такого файла или каталога нет

9

У меня есть сценарий, который начинается так

#!/bin/bash
VALKYRIE=~/myProjects/valkyrie
source $VALKYRIE/cluster.conf

но когда я запускаю его, он возвращается line 2: ~/myProjects/valkyrie/cluster.conf: No such file or directory

но файл существует и при запуске source ~/myProjects/valkyrie/cluster.confон работает нормально. Есть идеи? Я установил VALKYRIEпеременную в другом месте, так что жесткий код в пути не вариант.

хой
источник
Я не уверен на 100%, поможет ли это, но вы можете попробовать полностью заключить в кавычки переменную, если в ~ есть пробелы. Следовательно, source "${VALKYRIE}/cluster.conf".
Sparhawk
нет, это не помогает
Хой
1
Я думаю, что это связано с ~неправильным расширением. Когда я запускаю ваш скрипт с намеренно фальшивым путем, ошибка не говорит ~, а расширяет путь. Можете ли вы попробовать заменить ~в вашем скрипте абсолютный путь? Также попробуйте выполнить следующее в скрипте echo ~.
Sparhawk
2
Вы также можете попробовать $HOMEвместо ~.
Sparhawk
3
@ Khoi Это объясняет это. ~/.pam_environmentне является сценарием оболочки, поэтому он не выполняет общих действий, которые вы ожидаете от оболочки, таких как расширение тильды и расширение параметров, поэтому не будет заменен ~и $HOMEне будет заменен. Если ~/.profileвместо этого переместить эту строку и добавить ее export впереди, она должна работать.
Гейра

Ответы:

8

~кажется, не расширяется должным образом. Когда я запускаю ваш скрипт с намеренно фальшивым путем, ошибка не говорит ~, а расширяет путь (то есть, /home/sparhawk/fakepathнет ~/fakepath. Вы можете попробовать использовать $HOMEвместо этого ~или использовать полный путь в сценарии.

(Я не уверен, почему ~не работает в вашей системе, так как ваш сценарий работает нормально для меня.)

Sparhawk
источник
Когда вы посмотрите на порядок, в котором bash выполняет расширения ( gnu.org/software/bash/manual/bashref.html#Shell-Expansions ), вы увидите, что расширение тильды происходит до раскрытия переменных. Вот почему $HOMEлучше, чем ~в переменной
Гленн Джекман
@glennjackman Я не уверен, что понимаю. Почему приоритет имеет значение для переменных по сравнению с ~?
Sparhawk
1
это не совсем «приоритет», это просто то, что на первом месте. Обратите внимание x="~/.bashrc"; ls $x- в порядке расширений для команды "ls" bash ищет тильду и не находит ее; в конце концов, bash видит переменную и расширяет ее. bash не возвращается и снова не ищет тильды, на данный момент это просто простой символ. и в текущем каталоге нет файлов, начинающихся с тильды.
Гленн Джекман
Ах хорошо. Я думаю, я понял. Мне всегда было интересно, почему эта команда не x=~/".bashrc"; ls $xработает и работает. Спасибо за информацию.
Sparhawk