わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

dry runと本番実行

シェル上で,ファイルなどに影響を及ぼす処理はまだしたくないけれど,どんなコマンドが実行されるか---変数展開やワイルドカード処理にも注意しながら---をあらかじめ確認したいことがあります.リハーサル,と言ってもいいのですが,dry runのほうがなじみです.
dry runをするには,次の2種類の方法があります.

  • コマンドのオプションで指定する.
  • echoを先頭につける.

前者で有名なのは,makeの-nオプションです.後者は,実行したいコマンドに依存しません.
さて,dry runをしてみたところ,よさそうなので,本番として実行したいとなったときに,シェルでどうしましょうか.上矢印を押して直前のコマンドを出し,dry run用のオプションなりechoなりを削除するというのは,鈍くさく見えます.
bashzshで有効な方法は,「^」です.具体例を:

$ 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文字のことです.