【发布时间】:2010-10-16 22:12:35
【问题描述】:
我正在尝试使用-h filename 命令检查 KornShell (ksh) 脚本中是否存在符号链接。这在 HP 盒子上效果很好。
不确定 Linux、AIX 和 Solaris 机器的正确选项是什么。
对此有何见解?
【问题讨论】:
标签: shell unix scripting ksh symlink
我正在尝试使用-h filename 命令检查 KornShell (ksh) 脚本中是否存在符号链接。这在 HP 盒子上效果很好。
不确定 Linux、AIX 和 Solaris 机器的正确选项是什么。
对此有何见解?
【问题讨论】:
标签: shell unix scripting ksh symlink
有两种可能的选择
if [ -h filename ]
OR
ls -ltr | grep filename | grep ^l
如果 $?为 0 则文件已链接,否则未链接,我会更喜欢第一个选项。
【讨论】:
-h 是POSIX spec 的一部分;它应该适用于任何模糊合理的地方。
根据 Mac OS X 上的man test:
-L 也是标准化的,所以如果你发现-h 不起作用的地方,你应该尝试-L。
【讨论】:
-L 也存在于 POSIX 规范中,我们不应该根据手册页中的说明建议使用 -L 吗?
最好的答案是尝试系统上的“测试”手册页中的任何内容。如果这似乎有效,请不要再犹豫了。但是,如果它似乎不起作用,或者如果您对要测试的更晦涩的选项有疑问,那么您还应该查看您的 shell 的手册页以查看 'expr' 或 '[' 是否是内置的。在这种情况下,shell 可能正在使用内部实现,而不是从 /bin 调用 expr 实用程序。在 Solaris 上,我验证了 ksh93 将 [ 视为内置(即使手册页似乎没有这样说)。从 truss 输出可以看出 ksh 没有为 [.
运行 expr 命令 % 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【讨论】:
至少在 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 以查看您可以在给定环境中对文件和字符串使用的可用运算符。
【讨论】: