![我如何处理符号链接后面的真实文件?](https://linux22.com/image/1584407/%E6%88%91%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E5%90%8E%E9%9D%A2%E7%9A%84%E7%9C%9F%E5%AE%9E%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我有一个文件和一个符号链接:
file: ~/${USER_HOME}/blabla/.cheatsheet
symlink: ~/.cheatsheet (is linked to file above)
现在在我的脚本中我对文件执行一些操作,例如添加一行并按字母顺序对文件进行排序并移动它:
addOneCommand() {
file"=~/.cheatsheet"
# add it to the file
echo "${cmd}" >> "${file}"
# sort file instantly
cat "${file}" | sort > "${file}".tmp
mv "${file}".tmp "${file}"
}
但符号链接背后的实际文件不会受到脚本的影响(例如,不按字母顺序排序)。我该怎么做才能在 bash 脚本中使用“符号链接文件”?
谢谢。
答案1
重点是,你创建一个新文件${file}.tmp
,现在不是符号链接,然后重命名。
你可以尝试
cat "${file}".tmp >"${file}"
rm "${file}".tmp
代替
mv "${file}".tmp "${file}"
如果你不介意竞争条件的话。
附言:如果我理解你的意图正确的话,你可能想要的sort -u
不是简单的sort
答案2
您的问题是您正在使用mv
,它将替换符号链接。
您可以使用许多其他方法(请参阅 Eugen Rieck 的答案),但从根本上讲,您需要重复使用符号链接,而不是代替它。
sponge
是一个很好的工具,它还允许您删除文件的处理*.tmp
:
a
使用来自 的符号链接文件b
:
$ echo -e "3\n1\n2" > a
$ ln -s a b
$ ls -l
total 1
-rw-r--r-- 1 attie attie 6 Mar 5 15:44 a
lrwxrwxrwx 1 attie attie 1 Mar 5 15:44 b -> a
a
您可以通过进行排序和重写b
,而不会影响符号链接:
$ cat b | sort | sponge b
$ ls -l
total 1
-rw-r--r-- 1 attie attie 6 Mar 5 15:44 a
lrwxrwxrwx 1 attie attie 1 Mar 5 15:44 b -> a
$ cat b
1
2
3
答案3
readlink
您可以使用或命令找到符号链接后面的真实文件realpath
。