- ベストアンサー
シングルユーザモードがどうかをチェック
if [ "'who | wc -l | sed -e 's/^ *//''x" != \ "0"x -o "'whoami'x" != "root"x ]; then echo "You must be in single user mode." exit 1 fi これはシングルユーザモードかどうかをチェックするshスクリプトなんですが、sedのところがわからないでおります。 !=という記号が2つあること、2,3回出てきている「x」という文字が特に疑問です。 これがどのようにして、シングルユーザモードのチェックとして働くのでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
全体としては 「who で何かが表示される, あるいは whoami で root と表示されない」 ときに「シングルユーザモードではない」と判定しているようですね. シングルクオート(') とバッククオート(`) が混乱してますが. != については test(1) を見ていただく方が早いのですが, 前後の 2つの文字列が等しくなければ真となります. また, x を付けるのはこの手の比較をするときのお約束のようなもので, 例えば「環境変数 $FOO の値が bar かどうか」を判定するときに [ $FOO = bar ] とかやると $FOO が空 (あるいは未定義) のときにエラーになるのに対し, [ x$FOO = xbar ] とすれば $FOO が空であっても問題なく比較できる, ということです.... というのが公式見解のような気がしますが, 実は [ "$FOO" = bar ] と "" を付ければ $FOO が空であってもやはり問題なく比較できたりします. ので, 今の場合に関しては x は不用な感じがします.
その他の回答 (1)
- mdebugon
- ベストアンサー率75% (6/8)
質問者さんのやりたいことが、このスクリプトで十分に満たされているのであればかまいませんが、 本来シングルユーザモードは、システムのRUN-LEVELが "S" の状態をさします。 その意味では、"who -r"というコマンドを使用するのがベストです。 Linux ではRUN-LEVEL=3はtextモードのマルチユーザモード、RUN-LEVEL=5 はX-windowで マルチユーザモードのはずです。
お礼
ありがとうございます。ほかによい方法もあるようですね。このスクリプトは、勉強しているときに登場してきたものなので・・・。
お礼
しばらく用事のため、ネットが見れなくなる可能性が高いので、とりあえずここで締め切って、もう一度じっくり考えてみます。 丁寧な解説をありがとうございました。 どうしてもわかんなかったら、また質問させていただきますので、よろしくお願いします。
補足
回答ありがとうございます。xの意味についてはわかりました。 >シングルクオート(') とバッククオート(`) が混乱してますが. すいません、書き直します。 if [ "`who | wc -l | sed -e 's/^ *//'`x" != \ "0"x -o "`whoami`x" != "root"x ]; then echo "You must be in single user mode." exit 1 fi >whoami で root と表示されない それは、"`whoami`x" != "root"xの部分ですよね。その左側の"0"x -o はどういう意味なんでしょうか。 また、ここに出てきている「|」は、ORの意味なんでしょうか、パイプの意味なんでしょうか。 sedなんとか!=とそれ以降の式のつながりもよくわからないのです。