課題
作成した環境とは別の環境で、あるシェルスクリスプトを起動したとき、うまく実行されなかった。 どうやら実行環境のエイリアス設定が影響しているようだ。 例えば .bashrc で以下のようなエイリアスが設定されている。
alias rm='rm -i'
rmコマンドで -i オプションを指定すると、そのファイルを削除するか否かを問うプロンプトが表示される。 つまり、シェルスクリスプトの実行が意図せず停止してしまう可能性があるということだ。
実際に当環境(MacのTerminal)で実行してみると以下のようになった。
$ alias rm='rm -i' $ touch testfile $ rm testfile remove testfile?
このような状況を手軽に回避する方法はあるのか。
解決法
コマンド名の一部をクォートする。 例えばコマンド名の先頭にバックスラッシュ(\)を入れれば良い。 これで先頭の文字がクォートされたことになる。
実際に上記の rm コマンドの例において、コマンド名の一部をクォートしてみると、プロンプトは表示されずにファイルが削除された。
$ alias rm='rm -i' $ touch testfile $ \rm testfile $
コマンド名を一部クォートするだけでエイリアス設定の影響を回避できる理由は、シェルにおいて「エイリアス置換の評価が、クォート削除の評価より先に行われる」からだ。
上記の rm コマンドの例で説明すると、エイリアス置換の評価が行われるとき、コマンドラインの先頭のトークンは「\rm」となっており、これはエイリアス置換対象である「rm」とは異なると判断され、エイリアス置換は実行されない。 その後、クォート削除の評価により「\rm」は「rm」となり、通常の rm コマンドが呼び出されるのである。
所感
この方法は書籍等で学習したものではなく、業務上、あるチームメンバが作成したシェルスクリスプトを使用したときに見つけたものだ。 初見ではすぐには意味がわからなかったが、シェルの評価のルールに従うと、確かにエイリアス設定の影響を回避できるのだと感心した。