![创建一个“ln -s”来检查损坏的符号链接](https://linux22.com/image/152626/%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E2%80%9Cln%20-s%E2%80%9D%E6%9D%A5%E6%A3%80%E6%9F%A5%E6%8D%9F%E5%9D%8F%E7%9A%84%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5.png)
我正在尝试编写一个函数ln()
(如果调用它不是一个好主意ln
,它可能只是调用myln()
它或其他什么,但这并不重要)bash
,这样,
- 如果短选项
-s
不存在,它只会command ln
执行 - 如果短选项
-s
确实存在,它将执行所做command ln
的操作,除非要创建的符号链接包含损坏的链接。在这种情况下,它会向 stderr 打印警告,并且不会创建链接(或创建链接并随后立即将其删除)
由于该命令ln
以各种极其通用的形式提供选项,因此我不确定如何编写这样的函数来涵盖所有可能性。我确实知道如何编写它以实现简单的用法,例如ln -s [absolute path 1] [absolute path 2]
.
最好该函数能够涵盖ln
最新版本中的用法GNU
coreutils
(提出问题时最新版本是 8.31),但仅涵盖 in 的用法的函数POSIX
也可以。
边注:我已经写了一个“防错rm
”https://codereview.stackexchange.com/a/215226/155325,我想做类似的事情来做到“防故障” ln
。我自己正在使用它,我知道后果。我不会将它分发给不熟悉 Linux 的人并说“嘿,你应该rm
从现在开始使用它,你可以忘记这些警告rm /*
”
答案1
不确定这是否是您想要的,但在您的函数中,您可以namei
在创建符号链接之前使用命令检查目标文件。
$ touch file1
$ ln -s file1 file2
$ ln -s file2 file3
$ namei file3
f: file3
l file3 -> file2
l file2 -> file1
- file1
$ echo $?
0
$ rm file1 # break first symlink
$ ls -l
$ namei file3
f: file3
l file3 -> file2
l file2 -> file1
file1 - No such file or directory
$ echo $?
1