- ベストアンサー
コマンドでシングルクオーテションが必要な時
- lsコマンドやfindコマンドなど、一部のコマンドでは引数に'(シングルクオーテーション)をつける必要があります。
- lsコマンドでは、引数に'(シングルクオーテーション)をつけるとエラーになる場合があります。
- findコマンドでは、引数に'(シングルクオーテーション)をつけないとエラーになる場合があります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
まず、*(アスタリスク)をシェルがどう扱うかを知っておく必要があります。このあたりはDOS等と根本的にことなる部分なのですが、コマンドラインの * はシェルがファイル名に展開されてしまい、コマンドに引き渡された時点ですでにファイル名の羅列に変わっています。 しかし、''で囲むことによってそれを抑制することができます。""で囲ったり、前に\をつけたりしても同じ効果があります。ただし''と""では少し意味が違います(*に対する効果は同じです)。\は直後の1文字のみに効果があります。 echoコマンドを使って実験すると良くわかります。echo 'inst*' と echo inst* を実行してみてください。シェルが解釈した結果がそのまま出てきます。(ただし、instではじまる名前のファイルがないところでやると結果は同じになるので注意してください) たとえば、ご質問の例では、install,instant,instructionの3つのファイルがあったとすると、『ls inst*』とした場合にlsコマンドが受け取るコマンドラインは ls install instant instruction となっています。 逆に、lsなどの通常のコマンドは * を解釈する機能をもたないため、『ls 'inst*'』ですと、lsコマンドが受け取るコマンドラインは ls inst* となり、inst* という名前のファイルがないのでエラーになる、というわけです。 さて、''で囲むべきかどうかを覚えるか、という質問ですが、はっきりいいますと覚える必要はありません。なぜなら、findは特殊な部類にはいるからです。 通常のコマンドは、上記のように * の処理をシェルに任せているため、''で囲ってしまうとファイル名を認識できずにエラーとなってしまうわけです。 しかし、findは検索対象の条件として、自身が * を解釈して処理しなければならないため、シェルによる解釈を抑制してfindに*を引き渡せるよう''が必要になるわけです。 このようなコマンドは、grep等、他にもいくつかありますが、少数派です。 法則として、*を使って検索を行うコマンドがこれに該当する、と考えていただければほぼ間違いありません。 ただ、状況によって使いわけが必要なケースもあります。たとえば、先ほど実験したechoコマンドのように、ファイル名を羅列したいときと、*を画面に表示したいときで囲むか囲まないかが変わってくるわけです。 また、場合によってはファイル名中に * が含まれているケースもなきにしもあらずですので、そういうときは注意が必要です。
お礼
本当にありがとうございました。 すごく分かりやすくてすっきりしました。 LINUXを触り始めたばかりで、shigeさんのご回答からgrepやfindが…というところで本に書いてあったのはこういう意味だったのか!とやっと気づきました。 本当に丁寧なご回答ありがとうございました。