3

我正在尝试使用-h filename命令检查 KornShell (ksh) 脚本中是否存在符号链接。这在 HP 盒子上效果很好。

不确定 Linux、AIX 和 Solaris 机器的正确选项是什么。

对此有任何见解吗?

4

4 回答 4

6

-hPOSIX 规范的一部分;它应该在任何合理的地方都有效。

根据man test在 Mac OS X 上:

     -h file 如果文件存在并且是符号链接则为真。该运算符
                   保留与以前版本的兼容性
                   这个程序。不要依赖它的存在;改用 -L 。

-L也是标准化的,所以如果你发现任何地方-h不起作用,你应该尝试-L

于 2009-04-03T05:08:47.633 回答
5

至少在 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以查看在给定环境中可用于文件和字符串的可用运算符。

于 2009-04-01T16:52:11.867 回答
1

最好的答案是尝试系统上“测试”手册页上的任何内容。如果这似乎有效,请不要再犹豫了。但是,如果它似乎不起作用,或者如果您对要测试的更晦涩的选项有疑问,那么您还应该查看您的 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
于 2009-04-02T02:18:39.027 回答
0

有两种可能的选择

    if [ -h filename ] 
OR
    ls -ltr | grep filename | grep ^l

如果 $? 为 0 则文件已链接,否则未链接,我将更喜欢第一个选项。

于 2009-12-07T11:41:49.220 回答