джерело bash script: Немає такого файлу чи каталогу


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 спереду, він повинен працювати.
geirha

Відповіді:


8

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

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


Якщо ви подивитеся на порядок виконання bash розширень ( gnu.org/software/bash/manual/bashref.html#Shell-Expansions ), ви побачите, що розширення tilde відбувається перед розширенням змін. Ось чому $HOMEкраще, ніж ~у змінній
glenn jackman

@glennjackman Я не впевнений, що розумію. Чому пріоритет має значення для змінних проти ~?
Sparhawk

1
це не зовсім "пріоритет", це просто те, що перше. Поміркуйте x="~/.bashrc"; ls $x- у порядку розширень для команди "ls" bash шукає тильду і не знаходить її; врешті-решт bash бачить змінну і розширює її. Баш не повертається назад і знову шукає тильди, в цей момент це просто звичайний характер. і в поточному каталозі немає файлів, які починаються з тильди.
glenn jackman

Ага гаразд. Я думаю, що я це розумію. Мені завжди було цікаво, чому ця команда не x=~/".bashrc"; ls $xпрацює і працює. Дякую за інформацію.
Sparhawk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.