我正在尝试使用-h filename
命令检查 KornShell (ksh) 脚本中是否存在符号链接。这在 HP 盒子上效果很好。
不确定 Linux、AIX 和 Solaris 机器的正确选项是什么。
对此有任何见解吗?
-h
是POSIX 规范的一部分;它应该在任何合理的地方都有效。
根据man test
在 Mac OS X 上:
-h file 如果文件存在并且是符号链接则为真。该运算符 保留与以前版本的兼容性 这个程序。不要依赖它的存在;改用 -L 。
-L
也是标准化的,所以如果你发现任何地方-h
不起作用,你应该尝试-L
。
至少在 linux 系统上也是 -h (bash 是我的 shell):
lrwxrwxrwx 1 mule mule 37 Feb 27 09:43 mule.log -> /home/mule/runtime/mule/logs/mule.log
[mule@emdlcis01 ~]$ if [[ -h mule.log ]]; then echo "mule.log is a symlink that exists" ; fi
mule.log is a symlink that exists
检查man test
以查看在给定环境中可用于文件和字符串的可用运算符。
最好的答案是尝试系统上“测试”手册页上的任何内容。如果这似乎有效,请不要再犹豫了。但是,如果它似乎不起作用,或者如果您对要测试的更晦涩的选项有疑问,那么您还应该查看您的 shell 的手册页以查看 'expr' 或 '[' 是否是内置的。在这种情况下,shell 可能正在使用内部实现,而不是从 /bin 调用 expr 实用程序。在 Solaris 上,我验证了 ksh93 将 [ 视为内置(即使手册页似乎没有这样说)。从 truss 输出中,您可以看到 ksh 没有为 [.
% truss -f -texec /bin/ksh '[ -h /home ]' 26056: execve("/usr/bin/ksh", 0x08047708, 0x08047714) argc = 2 26056: execve("/usr/bin/ksh93", 0x08047708, 0x08047714) argc = 2 26056: execve("/usr/bin/amd64/ksh93", 0x08047704, 0x08047710) argc = 2 % truss -f -texec /bin/ksh '/bin/expr -h /home ]' 26058: execve("/usr/bin/ksh", 0x08047700, 0x0804770C) argc = 2 26058: execve("/usr/bin/ksh93", 0x08047700, 0x0804770C) argc = 2 26058: execve("/usr/bin/amd64/ksh93", 0x080476FC, 0x08047708) argc = 2 26058: execve("/bin/expr", 0x00418360, 0x00418398) argc = 4
有两种可能的选择
if [ -h filename ]
OR
ls -ltr | grep filename | grep ^l
如果 $? 为 0 则文件已链接,否则未链接,我将更喜欢第一个选项。