Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

シェルスクリプトでファイルパスを引用符で囲むべき理由――スペース1つがシステムを破壊する

ひどいプログラミングミスを集めたスレッドを偶然見かけたところ、衝撃的な実例を見つけました。

https://github.com/MrMEEE/bumblebee-Old-and-abbandoned/commit/a047be85247755cdbe0acce6f1dafc8beb84f2ac

このコミットには、次のような一行が含まれています。

rm -rf /foo-bar-usr /lib/nvidia-current/xorg/xorg

※安全のため、文字列に foo-bar- を追加しています。このまま実行しても問題の動作は発生しません。それでも、このコマンドがクリップボードにあるだけで不安になるほど危険なのです。

実行すると何が起こるのか?

/usr/ ディレクトリが丸ごと消去され、システムは事実上「文鎮化(ブリック)」してしまいます。原因は、たった一つの余分なスペースです。

/usr の直後にスペースがあるため、rm コマンドはこれを「削除すべき2つの別々のディレクトリ」と解釈します。タイプミスした1つのパスとしては認識されないのです。

もしパスが引用符で囲まれ、単一の引数として渡されていれば、この惨劇は起こらなかったはずです。

なぜ普段は引用符を省略されるのか

多くのコマンドラインの例では、引用符を付けるとスクリプトの意味が分かりにくくなったり、可読性が下がったりするため、あえて省略されることがあります。

しかし、コマンドラインで直接実行するのではなくスクリプトとして書く場合、そして特にユーザー入力を受け付ける場合(ユーザーが誤ってスペースを入力するかもしれません。決してユーザーを信用してはいけません)には、予防策としてファイルパスを引用符で囲むことを強くお勧めします。

自分のデータを失いたくないのは当然ですが、他人のデータを失うことはもっと避けなければなりません。

そしていつものように――ファイルとシステムのバックアップを定期的に取りましょう!こうしたミスはいつ紛れ込むかわかりません。しかも、そのミスが自分のものとは限らないのですから。

  1. 【bash入門】シェルスクリプトでuntilループを使う方法

    bashにはfor、while、untilという3つのループ構文が用意されています。それぞれ構文や動作は異なりますが、いずれも特定の条件式を評価しながらコードブロックを繰り返し実行するための仕組みです。 untilループは、条件式が「偽(false)」と評価されている間、コードブロックを実行し続けます。これはwhileループとは正反対の動作です。whileループは条件式が「真(true)」である間にコードブロックを実行するのに対し、untilループはその逆の挙動を取ります。 untilループの基本構文 until [ expression ] do code block ... ...

  2. iPhoneの名前を変更する方法と、変更すべき理由を徹底解説

    新しいiPhoneには、デフォルトであなたの本名が含まれた名前が自動的に付けられています。Apple IDの登録や初期設定時にペンネームなどを使用していない限り、iPhoneの名前にも本名がそのまま表示されることになります。この記事では、iPhoneの名前を変更する具体的な手順を詳しく解説します。さらに、iPhoneに接続したBluetoothアクセサリの名前を変更する方法や、画面が正常に動作しない場合でも名前を変更できるテクニックもご紹介します。iPhoneの名前を変更すべき理由iPhoneのデフォルト名には本名が含まれているため、AirDrop経由でプライバシーが漏洩するリスクがあります。