狂欢

狂欢

我不断得到

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

运行时deployment.sh,我不知道为什么,所有三个文件都在同一个目录中。

属性文件包含值,每个文件对应每个目标环境,例如:(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

.我认为您在此处看到的是POSIX shell 中的source 命令处理不合格文件名的结果dash- 这似乎与bash(至少在非 POSIX 模式下)不同:

bash记录的行为source(又名.是:

读取并执行来自文件名当前 shell 上下文中的参数。如果文件名不包含斜杠,则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

相关内容