32143


## 背景

UNIXのシェルスクリプトにおいて、コマンド引数に1文字だけのハイフン `-` (bare hyphen)
があるとき、これが特別な意味をもつときがあります。

特に、`-`が「標準入力から読み込む」「標準出力に書き込む」という意味になるコマンドが多いです。  
このことは、次にリンクする本家StackOverflowの質問にも書かれています。

  * ["What does dash “-” at the end of a command mean?"](https://unix.stackexchange.com/questions/41828/what-does-dash-at-the-end-of-a-command-mean)
  * ["Usage of dash (-) in place of a filename"](https://unix.stackexchange.com/questions/16357/usage-of-dash-in-place-of-a-filename)

また、["The Art of UNIX
Programming"](https://en.wikipedia.org/wiki/The_Art_of_Unix_Programming)
にも次のような記述を見つけました。

> Many tools accept a bare hyphen, not associated with any option letter, as a
> pseudo-filename directing the application to read from standard input.  
>  (<http://www.faqs.org/docs/artu/ch10s05.html>より引用)

和訳すると「多くのツールは、[a〜zのような]オプション文字列と関係がないただのハイフンを、アプリケーションが標準入力からreadすることを示す擬似ファイル名としている。」です。

しかし、いくつかのコマンドにおいては、`-`がこのような意味にはなっていません。

たとえばPOSIXコマンド`cd`について、`cd -` は「1つ前のディレクトリに戻る」という意味になります。より厳密には、`cd "$OLDPWD"
&& pwd` と同義です。

また、`mkdir`コマンドは`-`を特別扱いしておらず、(私の環境では) `mkdir -` は "-" という名前のディレクトリを作成します。

## 質問

それでは、`-`が特別扱いされているものの、stdin / stdoutへのリダイレクトとは関係がないようなコマンドは他にどのようなものがあるのでしょうか？

BSDかGNUか、POSIXか非POSIXか、builtin
commandかそうでないかなどは気にしませんが、それ特有の動作の場合、追記してくださると嬉しいです。


CC BY-SA 3.0
2017-01-25T02:33:48.333
32124
2020-05-08T10:22:06.783
2017-04-13T12:37:20.867
-1
19110
question
shellscript unix
1文字ハイフンが特別な意味を持つシェルコマンドの例を教えて下さい


  * cd(P)： bash組み込みコマンド、あるいは、POSIXコマンド。`cd -`は`$OLDPWD`へカレントディレクトリを変更する。([参考1](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html)、[2](http://www.unix.com/man-page/posix/1posix/cd/))
  * bash(1)： bashコマンド自体の引数として`-`が与えられている場合、`--`と同義になる。つまり、それ以降の文字列をオプションとして解釈しない。([参考](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html))
  * nslookup(1)： `nslookup - [server]`はnslookupを対話モード(インタラクティブモード)で起動する。([参考](https://linuxjm.osdn.jp/html/bind/man8/nslookup.8.html))
  * git(1): `git checkout -` は 1 つ前のブランチを checkout する。([参考](https://stackoverflow.com/a/7207542/5989200))

(自己回答ですが、これ以外の例を知りたいのでご存知でしたら投稿お願いいたします)


CC BY-SA 4.0
2017-01-25T02:33:48.333
32125
2020-05-07T08:38:45.277
2020-05-07T08:38:45.277
19110
19110
32124
answer


  * `su`

ハイフン１つは環境変数を置換先ユーザのものに置き換えるの意味 (実質再ログイン)

[code]

    $ su -
    Password:
    #
    
[/code]

  * dd

(題意と逆かもしれない)  
標準入出力を `-` で指定したくなるけどできない例が `dd` (GNU coreutil と hpux11.11 で確認)

[code]

    $ echo abc | dd of=-
    0+1 records in
    0+1 records out
    $ dd if=-
    abc
    0+1 records in
    0+1 records out
    $
    
[/code]

最初の `dd` で `abc改行` はファイル `-` に出力され  
次の `dd` でファイル `-` の内容が標準出力に出力される

### おまけ１

先の例で作ってしまったハイフン１文字のファイルを  
`cat` したいとき `cat -` ではダメ (標準入力の意味になる) `cat ./-` なら OK  
`rm` に標準入出力を渡すことは無いので `rm -` は有効な様子

### おまけ２

ハイフンで始まるファイル名 `-a` 等を各種ツールに渡したいとき  
`cat -a` は失敗するので `cat ./-a` または `cat -- -a`  
`rm -a` は失敗するので `rm ./-a` または `rm -- -a`


CC BY-SA 3.0
2017-01-25T07:06:50.290
32143
2017-01-25T10:15:20.970
2017-01-25T10:15:20.970
754
8589
32124
answer


`trap`の`-`も標準入出力とは無関係です。

【BASH_BUILTINS(1) General Commands Manual】

> trap [-lp] [[arg] sigspec ...]  
>  シェルがシグナル sigspec を受け取ると、コマンド arg が読み込まれて、実行されます。 arg が存在しない (かつ sigspec
> が一つ指定された) 場合か、 arg が - の場合、 指定されたシグナルは全てオリジナルの動作 (シェルの起動時に設定されていた値)
> にリセットされます。

`man exec`で出てきました。

【実行例】

[code]

    $ trap date INT
    $ trap -p INT
    trap -- 'date' SIGINT
    $ ^C2020年  5月  8日 金曜日 16:28:25 JST
    
    $ trap - INT
    $ trap -p
    trap -- '' SIGRTMIN
    $ ^C
    $
    
[/code]

* * *

無理やりですが、`expr`の`-`もコマンドの引数ですが、標準入出力とは無関係です。  
【実行例】

[code]

    $ expr 8 - 3
    5
    
[/code]


CC BY-SA 4.0
2020-05-08T07:39:36.130
66426
2020-05-08T10:22:06.783
2020-05-08T10:22:06.783
35558
35558
32124
answer