-r というファイルを削除したい、みたいな話です。
基本
- コマンドの引数に
--
が現れたら、それ以降は-
から始まる列でもオプションとして解釈しなくなります - ハイフンから始まるものがファイル名なら、パスを
./-hoge
と指定すればハイフンから始まらずに済みます
失敗する例
% echo hoge > -r
% ls
-r
% rm -r
rm: missing operand
Try 'rm --help' for more information.
この通り、ハイフンから始まる〇〇を何も考えずに扱うと、図らずもオプションとして解釈されて残念な結果になります。
--
以降はオプションにならない
% ls
-r
% rm -- -r
% ls
--
を前置してやれば、それ以降はオプションとして解釈されず、意図した動きをしてくれます。
-
が先頭に来ないように工夫する
% ls
-r
% rm ./-r
% ls
そもそもパス名なら、./
を明示して相対パス指定すればハイフン始まりにならないので、そう書き換えるのも有効です。
両方とも知っておかないといけないという話
上に示したふたつの方式は、実は使い分けが必要な場合があります。
-
ディレクトリに cd
したい
これは、「ハイフンから始まる」とは厳密には違う話ですが。
cd
コマンドには、cd -
で直前のディレクトリに戻るという機能があります。なので、-
というディレクトリに何も考えずに移動しようとすると、
% pwd
/Users/hmwakasa/test
% mkdir test3
% cd test3
% mkdir -- -
% ls -F
-/
% cd -
~/test
% pwd
/Users/hmwakasa/test
移動できません。こういうときは ./
を明示した相対パスで指定するとよいです。
% ls -F
-/
% cd ./-
% pwd
/Users/hmwakasa/test/test3/-
cd -
は何かオプションを指定しているわけではないので、--
前置では解決できません。
-
から始まる文字列を grep
したい
./
明示指定法で歯が立たないものがあります。それは、-
から始まるものがパスではない場合です。具体的には、-
から始まる文字列を grep
する場合です。
grep
のヘルプメッセージから、-P
オプションの意味を検索したいとします。
% grep --help | grep -F -P
grep: conflicting matchers specified
こういうときは --
前置するしかありません。
% grep --help | grep -F -- -P
-P, --perl-regexp PATTERNS are Perl regular expressions
まとめ
最後の grep の例はともかく、そもそも記号から始まるファイルは作らないようにしよう。