質問: 背景 -- UNIXのシェルスクリプトにおいて、コマンド引数に1文字だけのハイフン `-` (bare hyphen) があるとき、これが特別な意味をもつときがあります。 特に、`-`が「標準入力から読み込む」「標準出力に書き込む」という意味になるコマンドが多いです。 このことは、次にリンクする本家StackOverflowの質問にも書かれています。 * "What does dash “-” at the end of a command mean?" * "Usage of dash (-) in place of a filename" また、"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. > > (より引用) > > > 和訳すると「多くのツールは、[a〜zのような]オプション文字列と関係がないただのハイフンを、アプリケーションが標準入力からreadすることを示す擬似ファイル名としている。」です。 しかし、いくつかのコマンドにおいては、`-`がこのような意味にはなっていません。 たとえばPOSIXコマンド`cd`について、`cd -` は「1つ前のディレクトリに戻る」という意味になります。より厳密には、`cd "$OLDPWD" && pwd` と同義です。 また、`mkdir`コマンドは`-`を特別扱いしておらず、(私の環境では) `mkdir -` は "-" という名前のディレクトリを作成します。 質問 -- それでは、`-`が特別扱いされているものの、stdin / stdoutへのリダイレクトとは関係がないようなコマンドは他にどのようなものがあるのでしょうか? BSDかGNUか、POSIXか非POSIXか、builtin commandかそうでないかなどは気にしませんが、それ特有の動作の場合、追記してくださると嬉しいです。
回答: `trap`の`-`も標準入出力とは無関係です。 【BASH_BUILTINS(1) General Commands Manual】 > > trap [-lp] [[arg] sigspec ...] > > シェルがシグナル sigspec を受け取ると、コマンド arg が読み込まれて、実行されます。 arg が存在しない (かつ sigspec が一つ指定された) 場合か、 arg が - の場合、 指定されたシグナルは全てオリジナルの動作 (シェルの起動時に設定されていた値) にリセットされます。 > > > `man exec`で出てきました。 【実行例】 ``` $ trap date INT $ trap -p INT trap -- 'date' SIGINT $ ^C2020年 5月 8日 金曜日 16:28:25 JST $ trap - INT $ trap -p trap -- '' SIGRTMIN $ ^C $ ``` 無理やりですが、`expr`の`-`もコマンドの引数ですが、標準入出力とは無関係です。 【実行例】 ``` $ expr 8 - 3 5 ```