这是测试符号链接是否具有 /proc/ 目录的正确方法吗

这是测试符号链接是否具有 /proc/ 目录的正确方法吗

我需要测试是否/etc/mtab 是指向的符号链接。我需要遵守 POSIX 标准。(一般来说应该在 RHEL 5 到 RHEL 7 上运行。)这是我目前所拥有的:/proc/something

#!/bin/bash
if [ $(readlink -f /etc/mtab | grep '\/proc\/') ]; then
    echo do something related to proc
else
    echo do something other than proc
fi

我错过了一些边缘情况吗?

答案1

  1. 如果/etc/mtab是 的符号链接怎么办/home/mikasa/proc/something?您可能应该^在 grep 正则表达式中添加 a 。
  2. 说到这里,/不是正则表达式中的特殊字符,因此不需要转义它们。
  3. 您应该引用 shell 变量引用,除非您有充分的理由不这样做,并且您确定您知道自己在做什么。这包括$(…)命令替换。在真正病态的边缘情况下,其中/etc/mtab 是 的符号链接/proc/foo = bar,您的命令扩展到
    如果 [ /proc/foo = 栏 ]
    当然,其评估结果为 false。您可以通过将其放入$(…)双引号来解决此问题:
    如果 [$(readlink -f /etc/mtab | grep '^/proc/')];然后
  4. 但您不需要进行命令替换或test(又名[...... ])。  grep给出一个退出状态,指示它是否找到了您告诉它寻找的模式,因此您应该能够将命令简化为:
    如果 readlink -f /etc/mtab | grep '^/proc/' > /dev/null;然后

答案2

readlink -f尽管不是 POSIX,但您的代码似乎可以满足您的要求。

另一个不错的非 POSIX 解决方案是:

if [ "$(df --output=fstype  /etc/mtab  | tail -n +2)" = "proc" ]; then

(如果 proc 文件系统未安装在 /proc 上,这甚至应该可以工作)

但也许在现实世界中,简单地检查就足够了

if [ -L /etc/mtab ]; then

最后一个甚至在 util-linux 测试套件中使用,到目前为止他们还没有收到错误报告。似乎在任何现有的 Linux 发行版上 /etc/mtab 要么是常规文件,要么是 /proc/self/mounts 的符号链接。

相关内容