【问题标题】:Check if file is a link on Linux检查文件是否是 Linux 上的链接
【发布时间】:2010-10-16 22:12:35
【问题描述】:

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

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

对此有何见解?

【问题讨论】:

    标签: shell unix scripting ksh symlink


    【解决方案1】:

    有两种可能的选择

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

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

    【讨论】:

      【解决方案2】:

      -hPOSIX spec 的一部分;它应该适用于任何模糊合理的地方。

      根据 Mac OS X 上的man test

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

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

      【讨论】:

      • 既然-L 也存在于 POSIX 规范中,我们不应该根据手册页中的说明建议使用 -L 吗?
      【解决方案3】:

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

      【讨论】:

        【解决方案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 以查看您可以在给定环境中对文件和字符串使用的可用运算符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-28
          • 2012-06-19
          • 2014-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多