问题
我有这个bash脚本:
ACTIVE_DB=$(grep -P "^[ \t]*db.active" config.properties | cut -d= -f2 | tr -s " ")
echo $ACTIVE_DB
if [ "$ACTIVE_DB" = "A" ]
then
ln -sf config-b.properties config.properties
else
ln -sf config-a.properties config.properties
fi
config-a.properties
db.active = A
config-b.properties
db.active = B
当我运行脚本时,会执行一次硬拷贝(=
cp
),而config.properties
通常不是符号链接(也不是物理链接),而是一个全新的文件,其内容与config-a.properties
或config-b.properties
相同。$ ls -li
53 -rw-r--r-- 1 ogregoir ogregoir 582 Sep 30 15:41 config-a.properties
54 -rw-r--r-- 1 ogregoir ogregoir 582 Sep 30 15:41 config-b.properties
56 -rw-r--r-- 1 ogregoir ogregoir 582 Oct 2 11:28 config.properties
当我手动逐行在提示符中运行此命令时,没有任何问题,并且符号链接确实始终会被创建,
config.properties
指向 config-a.properties
或者 config-b.properties
。$ ls -li
53 -rw-r--r-- 1 ogregoir ogregoir 582 Sep 30 15:41 config-a.properties
54 -rw-r--r-- 1 ogregoir ogregoir 582 Sep 30 15:41 config-b.properties
55 lrwxrwxrwx 1 ogregoir ogregoir 20 Oct 2 11:41 config.properties -> config-b.properties
注意事项
- 没有任何其他地方打开文件(我是唯一的活动用户,使用配置文件的应用程序也未在运行)。
- 有时
ln -sf
会表现正常,但通常规则是它会制作一个硬链接副本。 - 脚本是从另一个目录运行的,但在执行此处操作之前,会
cd
到包含config*.properties
文件的目录。 - 脚本要长得多,但这是重现错误的最短示例。
bash
版本为4.1.2(它是本地的,所以我不关心shellshock)。ln
版本为8.4。- 操作系统:Red Hat Enterprise Linux Server release 6.5(Santiago)。
- 用于该文件夹的文件系统:ext4。
问题
- 为什么我的脚本不一致地创建符号链接而是制作硬链接副本?
- 如何在此处强制进行符号链接?
command -v ln
,以显示ln
实际调用的内容(以排除 shell 函数或意外二进制文件,如/this/is/wrong/ln
)。由于符号链接的目标甚至不需要存在,因此先前的命令对您观察到的内容几乎没有任何影响。 - chepnerconfig.properties
中使用了sed -i
。等我回到工作岗位再检查一下。 - Olivier Grégoire