我需要测试是否/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
- 如果
/etc/mtab
是 的符号链接怎么办/home/mikasa/proc/something
?您可能应该^
在 grep 正则表达式中添加 a 。 - 说到这里,
/
不是正则表达式中的特殊字符,因此不需要转义它们。 - 您应该引用 shell 变量引用,除非您有充分的理由不这样做,并且您确定您知道自己在做什么。这包括
$(…)
命令替换。在真正病态的边缘情况下,其中/etc/mtab
是 的符号链接/proc/foo = bar
,您的命令扩展到如果 [ /proc/foo = 栏 ]
当然,其评估结果为 false。您可以通过将其放入$(…)
双引号来解决此问题:如果 [”$(readlink -f /etc/mtab | grep '^/proc/')”];然后
- 但您不需要进行命令替换或
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 的符号链接。