/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を追加する必要があります。 - 言い換えれば、
/
正規表現には特殊文字がないので、エスケープする必要はありません。 - そうしない妥当な理由がなく、自分が何をしているのかを知らない限り、シェル変数参照を引用する必要があります。これには
$(…)
コマンド置換が含まれます。/etc/mtab
シンボリックリンクがあり、/proc/foo = bar
コマンドが次に拡張される非常に深刻な状況の場合if [ /proc/foo = 列 ]
もちろん、偽と評価されます。二重引用符で囲むことで$(…)
この問題を解決できます。もし[」$(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へのシンボリックリンクのようです。