Источник сценария 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вместо этого ~или использовать полный путь в сценарии.

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


Когда вы посмотрите на порядок, в котором 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.