シェル上で,ファイルなどに影響を及ぼす処理はまだしたくないけれど,どんなコマンドが実行されるか---変数展開やワイルドカード処理にも注意しながら---をあらかじめ確認したいことがあります.リハーサル,と言ってもいいのですが,dry runのほうがなじみです.
dry runをするには,次の2種類の方法があります.
- コマンドのオプションで指定する.
- echoを先頭につける.
前者で有名なのは,makeの-nオプションです.後者は,実行したいコマンドに依存しません.
さて,dry runをしてみたところ,よさそうなので,本番として実行したいとなったときに,シェルでどうしましょうか.上矢印を押して直前のコマンドを出し,dry run用のオプションなりechoなりを削除するというのは,鈍くさく見えます.
bashとzshで有効な方法は,「^」です.具体例を:
$ make -n abc.xyz $ ^-n
$ echo df $HOME $ ^echo
makeの例では,「^-n」を実行することで,直前のコマンドから「-n」を取り除いたものを,新たにコマンドとして実行します.dfを含む例では,同様に,「echo」を取り除きます.
zshユーザ限定ですが,もうひと工夫できます.あらかじめ,~/.zshrcに
setopt hist_ignore_space
を書いておきます.これは,コマンドの先頭が空白のときは,ヒストリ(履歴)に登録しないという指示です.そして,
$ echo df $HOME
を実行した直後に,「^echo」と「^echo空白*1」とで意味が違ってきます.「^echo」は
$ df $HOME
となり,先頭に空白がありますので,ヒストリに残りません.一方,「^echo空白」だと
$ df $HOME
ですので,ヒストリに残るということです.
ちなみに,make -nのあとで,本番実行でしかもヒストリに残さないというニーズは,あるのかどうか分かりませんが,やり方を書いておくと,
$ make -n abc.xyz $ ^make -n^ make
です.「^何を^何に」です.さらにニーズは不明ですが,「!:gs^何を^何に」として実行すると,直前のコマンドの「何を」に該当する文字列をすべて「何に」に置き換えて,実行してくれます.
*1:もちろん,「空白」は,そういう日本語の2文字ではなく,いわゆる半角の空白1文字のことです.