# 第三章 GNUとUnixのコマンド
練習問題3.10
bash上で以下のコマンドを順に実行しました。
$ PATH=/opt/bin:$PATH
$ echo $PATH
/opt/bin:/usr/local/bin:/usr/bin:/bin
直後に、これまでに実行した、「$PATH」という文字列を含んだコマンド履歴を全て表示しようと、次のコマンドを実行しました。
$ history | grep $PATH
少なくとも直前の2行が表示されることを期待しましたが、結果は何も表示されませんでした。このことに関する説明として適切と考えられるものを選択してください。
A. bashはログアウト時に履歴が記録されるので、直前のコマンドはhistoryコマンドで出力されない
B. デフォルトでは.bash_historyファイルが用意されていないので、あらかじめ作成しておく必要がある
C.historyコマンドは引数に出力行数を指定する必要がある
D. grepコマンドではなくfgrepコマンドを使う必要がある
E. シェルによって展開されないよう'$PATH'のように引用符で囲む必要がある
(解答)E
(解説)
シェル上では、$記号に続けて文字列があれば、変数として展開されます。つまり変数の内容に置き換えられてからコマンドが実行されます。そのため、設問の最後のコマンドでは、次のように引数を指定したのと同じことになります。
$ history | grep/opt/bin:/usr/local/bin:/usr/bin:/bin
「$PATH」という文字列をコマンド履歴から検索したい場合は、シェルによって変数が展開されないよう、引用符で囲むか、「\」でエスケープする必要があります。次のいずれのコマンドでも構いません。
$ history | grep '$PATH'
$ history | grep \$PATH
したがって、正解は選択肢Eです。historyコマンドは直前に実行したコマンド履歴も表示できますので、選択しAは不正解です。履歴ファイル.bash_historyがなくてもコマンド履歴機能は利用できますので、選択肢Bは不正解です。historyコマンドは引数に出力行数を指定する必要はありませんので、選択肢Cは不正解です。fgrepコマンドを使っても引数の変数は展開されますので、選択肢Dは不正解です。
fgrepコマンド
grepコマンドの一種で、検索パターンに正規表現を使わない場合に使用する例えば「.*」みたいに正規表現でない文字列を使用する場合に用います。