読者です 読者をやめる 読者になる 読者になる

シェルスクリプトを公開するとき, コマンド前にバックスラッシュをつけるべき

shellscript

oh-my-zsh の環境で、peco-select-history が動かない - Qiita

追記 2014年 7月 7日

シェルスクリプトと書いてしまい漠然すぎましたが, ここで述べている
ことが問題になるのは, .bashrc, .zshrcに関数, alias設定等がコピー
される場合や, sourceコマンドでファイルを読み込む場合です.
non-interactiveに実行されるシェルスクリプトについては特に
問題ないです.

問題点

そうしないと, 公開されたコマンドを自分の環境に導入した場合,
aliasにより正しく動かなく場合があるためです. aliasをつけがちな
コマンド(ls, grep等)がシェルスクリプトに含まれていると
特に問題が起こる可能性が高くなります.

pecoを使って カレントディレクトリのファイルをページャで開く
例を考えてみましょう. 単純に考えると以下のようになります.

 % ls -1 | peco |xargs less
 % alias pp='ls -1 | peco |xargs less'

しかし以下のような aliasが定義されているとどうでしょう.

  % alias ls='ls -l'

これだと 'ls -l'の任意の行の結果が lessの引数として与えられて
しまい, 期待した通りに動作しません.

解決方法

先ほど挙げた問題を回避するためにはコマンドの前にバックスラッシュを
つけます(日本語キーボードだと円記号).

 % \ls -1 | \peco |\xargs less
 % alias pp='\ls -1 | \peco |\xargs less'


これで, aliasを無視できます. aliasをつけないだろってコマンドも数多く
あるかと思いますが, 誰がどんな aliasをつけているかなんて予測できない
ので, 全部のコマンドの先頭につけておくのが無難かと思います.

おわりに

自分で書いて自分しか使わないケースだと別にどうでもいいと
思うのですが, 他の人が使うような場合は aliasを無視するように
バックスラッシュをつけるべきでしょう. 特にたくさんの人に
ブログ記事, Qiitaへの投稿が読まれる人はそのシェルスクリプト
コピペされまくるおそれがあるので,多大な被害をもたらす可能性が
あるので注意した方が良いと思います.