我不断得到
./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