0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ハイフンから始まる〇〇を✗✗したい

Posted at

-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 の例はともかく、そもそも記号から始まるファイルは作らないようにしよう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?