2005年09月18日

オプションを使いたくないとき。

grep と fgrep の関係もそうですが、
意外と知らない人が多そうなことをちょっと思い出したので書いてみます。

Linux/UNIX ではオプションとして '-' (ハイフン=ダッシュ) の後に文字列を
入力することで挙動を制御します。
では、たとえばです。
'-g' という文字列を検索したいとき。

grep '-g' ファイル名〜

とかってやると怒られてしまいます。
実際に試して見ましょう。

[k-square@server] ~
$ cat > a
-f
-g
-a
-b
a
b
c
d
^D
[k-square@server] ~
$ grep '-g' a
grep: invalid option -- g
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

これはクォートで閉じても関係なく、 '-' から始まる文字は検索文字列ではなく
オプションとして扱われてしまうからです。
コレを防ぐには、 '--' を前に入れることで対処できます。
'--' はそれ以降にあるものはオプション以外のものとして扱うようになってます。

[k-square@server] ~
$ grep -- '-g' a
-g

この状態でもオプションを入れたいときは '--' の前に入れれば OK です。
こんな感じです。

[k-square@server] ~
$ grep -l -- '-g' a
a

この辺りのコトは、shell script を作る上で、
getopt の挙動を理解するとわかるようになると思います☆
# 普段使うのは getopts ですけどね♪

Posted by k-square : 2005年09月18日 02:50 | Linux/UNIX
コメント

お久しぶりです。
これは初めて知りました。
つい最近、ls コマンドの --show-control-chars オプションが思い出せなくて
ls --help|grep '--show'
としてエラーが出たのですが、
それはこういうことだったんですね。
すっきりしました。
試しに
ls --help|grep -- '--show'
にしてみたら確かに意図された通りの結果になりますね。
ひとつ賢くなりました。 (笑)

Posted by: Noppi : 2005年09月25日 01:43

知らなくても困りはしないんですが、便利です。
-rf なんていうファイルを消したくても安心です(笑)

ちなみに '--' の使い方を知らないときは、
grep '[-][-]show'
なんてするぐらいしか思い浮かびません・・・。


Posted by: k-square : 2005年09月27日 00:06
コメントする









名前、アドレスを登録しますか?