自分にやさしく学ぶプログラミング

プログラミング学習記録、備忘録

bashにおける '-' (ハイフン)の意味

現在シェルスクリプトの勉強をしており、サンプルコードを読んでいたら不思議な記述に出会ったので記載しておきます。

サンプルコード

今回読んでいたサンプルコードはこちら。

テキストファイルを出力するコード

日経XTEC: 再入門 体で覚えるLinuxの基本 より)

指定したディレクトリの中のテキストファイルを検出するスクリプトです。 気になったのはこの記述。

  if echo $* | grep -q text -

ハイフンで終わっています。何このハイフン?

'-' (ハイフン)は標準入出力を表す

自分で調べても分からず、メンターさんに聞いてみたところ、下記の情報を教えていただきました。

Using - as a filename to mean stdin/stdout is a convention that a lot of programs use. It is not a special property of the filename. The kernel does not recognise - as special so any system calls referring to - as a filename will use - literally as the filename.
(from StackExchange: Usage of dash (-) in place of a filename )

ハイフンは特殊文字ではなく、慣習として、標準入出力を表す・・・。
ちょっと釈然としない部分もあるんですが、今回の場合、「パイプで渡されたデータはここの位置(今回はファイル名にあたる)に入りますよ」という意味で、あってもなくても良いもののようです。
実際、ハイフンを消して実行してみましたが、結果に違いはありませんでした。
パイプで渡された情報の入る位置が後ろの方だから、わかりやすいように明示したのかな・・・?

'-'によって結果が変わる場合

コマンドによっては結果が変わることもあります。
上記のページにも書いてありますが、例えばcat -とすると、キーボードから入力した文字をそのまま出力するモードに入ります。
通常catの引数にはファイル名が来て、そのファイルの中身が渡されるけど、cat -の場合は代わりに標準入力が渡されます。
同じように、例えば ls -l | vi とすると、ls -iの結果が入力された状態でviが開かれます。これは便利・・・なのか?

まとめ

'-'は基本的に特殊文字ではなく、慣習として標準入出力を表します。
cat等のコマンドに付けると、標準入力を渡すこともできます。
・・・そういうことだと飲み込む!

違うぞ!!って場合はぜひご指摘いただければと思います。 それでは。