Я продолжаю получать
./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:
Я думаю, что то, что вы видите здесь, является результатом того, как исходная команда . в оболочке POSIX dash обрабатывает неквалифицированные имена файлов - которая, по-видимому, отличается от bash (по крайней мере, когда она находится в не-POSIX):
В bash документированное поведение для source (aka .):
Чтение и выполнение команд из аргумента имени файла в текущий контекст оболочки. Если имя файла не содержит косой черты, переменная PATH используется для поиска имени файла. Если Bash не находится в режиме POSIX, поиск текущего каталога выполняется, если имя файла не найдено в $PATH.Другими словами, . (или source) выполняет поиск PATH, а затем возвращается к текущему каталогу. Например, если задано
$ cat > foo.sh
#!/bin/sh
bar=foo
, тогда
$ 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
Я думаю, что то, что вы видите здесь, является результатом того, как исходная команда . в оболочке POSIX dash обрабатывает неквалифицированные имена файлов - которая, по-видимому, отличается от bash (по крайней мере, когда она находится в не-POSIX):
В bash документированное поведение для source (aka .):
Чтение и выполнение команд из аргумента имени файла в текущий контекст оболочки. Если имя файла не содержит косой черты, переменная PATH используется для поиска имени файла. Если Bash не находится в режиме POSIX, поиск текущего каталога выполняется, если имя файла не найдено в $PATH.Другими словами, . (или source) выполняет поиск PATH, а затем возвращается к текущему каталогу. Например, если задано
$ cat > foo.sh
#!/bin/sh
bar=foo
, тогда
$ 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
Я думаю, что то, что вы видите здесь, является результатом того, как исходная команда . в оболочке POSIX dash обрабатывает неквалифицированные имена файлов - которая, по-видимому, отличается от bash (по крайней мере, когда она находится в не-POSIX):
В bash документированное поведение для source (aka .):
Чтение и выполнение команд из аргумента имени файла в текущий контекст оболочки. Если имя файла не содержит косой черты, переменная PATH используется для поиска имени файла. Если Bash не находится в режиме POSIX, поиск текущего каталога выполняется, если имя файла не найдено в $PATH.Другими словами, . (или source) выполняет поиск PATH, а затем возвращается к текущему каталогу. Например, если задано
$ cat > foo.sh
#!/bin/sh
bar=foo
, тогда
$ 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