чтение значений из свойства.ini и получение файла не найдено

Я продолжаю получать

./config.sh: line 5: .: properties_DEV.ini: file not found

При запуске deployment.sh я не уверен, почему все три файла находятся в одном каталоге. Файл свойства

содержит значения, каждый файл для каждого целевого примера env: (properties_DEV.ini)

config_webApp_url=http://dev1

Затем config.sh загружает этот файл свойств и другие значения конфигурации:

#!/bin/sh #target machine installation_target_machine=DEV #load specific machine properties file . properties_${installation_target_machine}.ini #Read a value from properties file webApp_url=${config_webApp_url}

и последний файл deployment.sh:

#!/bin/sh # read the installation values from config.sh . ./config.sh #do stuff with target configuration echo going to copyToUrl: ${webApp_url}

Обновление: добавить запрошенный результат

user1@dev:/tmp/test> ls -lb total 12 -rwxr-x--- 1 user1 mqm 212 Jan 16 11:35 config.sh -rwxr-x--- 1 user1 mqm 146 Jan 16 11:37 deployment.sh -rw-r----- 1 user1 mqm 30 Jan 16 11:36 properties_DEV.ini user1@dev:/tmp/test> ./deployment.sh ./config.sh: line 5: .: properties_DEV.ini: file not found going to copyToUrl:
1
задан 17 January 2018 в 05:39

3 ответа

Я думаю, что то, что вы видите здесь, является результатом того, как исходная команда . в оболочке POSIX dash обрабатывает неквалифицированные имена файлов - которая, по-видимому, отличается от bash (по крайней мере, когда она находится в не-POSIX):

В bash документированное поведение для source (aka .):

Чтение и выполнение команд из аргумента имени файла в текущий контекст оболочки. Если имя файла не содержит косой черты, переменная PATH используется для поиска имени файла. Если Bash не находится в режиме POSIX, поиск текущего каталога выполняется, если имя файла не найдено в $PATH.

Другими словами, . (или source) выполняет поиск PATH, а затем возвращается к текущему каталогу. Например, если задано

$ cat > foo.sh
#!/bin/sh

bar=foo

, тогда

bash

$ echo "$bar"

$ . foo.sh
$ echo "$bar"
foo

Однако в dash поведение больше похоже на поиск исполняемых файлов:

тире

$ echo "$bar"

$ . foo.sh
sh: 2: .: foo.sh: not found

т.е. он не возвращается к текущему каталогу после поиска PATH; вам необходимо префикс имени файла с помощью ./ явно:

$ . ./foo.sh
$ 
$ echo "$bar"
foo

TL; DR изменить

. properties_${installation_target_machine}.ini

на

. ./properties_${installation_target_machine}.ini
]

или используйте #!/bin/bash вместо #!/bin/sh

3
ответ дан 22 May 2018 в 15:29

Я думаю, что то, что вы видите здесь, является результатом того, как исходная команда . в оболочке POSIX dash обрабатывает неквалифицированные имена файлов - которая, по-видимому, отличается от bash (по крайней мере, когда она находится в не-POSIX):

В bash документированное поведение для source (aka .):

Чтение и выполнение команд из аргумента имени файла в текущий контекст оболочки. Если имя файла не содержит косой черты, переменная PATH используется для поиска имени файла. Если Bash не находится в режиме POSIX, поиск текущего каталога выполняется, если имя файла не найдено в $PATH.

Другими словами, . (или source) выполняет поиск PATH, а затем возвращается к текущему каталогу. Например, если задано

$ cat > foo.sh #!/bin/sh bar=foo

, тогда

bash

$ echo "$bar" $ . foo.sh $ echo "$bar" foo

Однако в dash поведение больше похоже на поиск исполняемых файлов:

тире

$ echo "$bar" $ . foo.sh sh: 2: .: foo.sh: not found

т.е. он не возвращается к текущему каталогу после поиска PATH; вам необходимо префикс имени файла с помощью ./ явно:

$ . ./foo.sh $ $ echo "$bar" foo

TL; DR изменить

. properties_${installation_target_machine}.ini

на

. ./properties_${installation_target_machine}.ini ]

или используйте #!/bin/bash вместо #!/bin/sh

3
ответ дан 17 July 2018 в 22:51

Я думаю, что то, что вы видите здесь, является результатом того, как исходная команда . в оболочке POSIX dash обрабатывает неквалифицированные имена файлов - которая, по-видимому, отличается от bash (по крайней мере, когда она находится в не-POSIX):

В bash документированное поведение для source (aka .):

Чтение и выполнение команд из аргумента имени файла в текущий контекст оболочки. Если имя файла не содержит косой черты, переменная PATH используется для поиска имени файла. Если Bash не находится в режиме POSIX, поиск текущего каталога выполняется, если имя файла не найдено в $PATH.

Другими словами, . (или source) выполняет поиск PATH, а затем возвращается к текущему каталогу. Например, если задано

$ cat > foo.sh #!/bin/sh bar=foo

, тогда

bash

$ echo "$bar" $ . foo.sh $ echo "$bar" foo

Однако в dash поведение больше похоже на поиск исполняемых файлов:

тире

$ echo "$bar" $ . foo.sh sh: 2: .: foo.sh: not found

т.е. он не возвращается к текущему каталогу после поиска PATH; вам необходимо префикс имени файла с помощью ./ явно:

$ . ./foo.sh $ $ echo "$bar" foo

TL; DR изменить

. properties_${installation_target_machine}.ini

на

. ./properties_${installation_target_machine}.ini ]

или используйте #!/bin/bash вместо #!/bin/sh

3
ответ дан 24 July 2018 в 13:28

Другие вопросы по тегам:

Похожие вопросы: