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

シェルでlsをバッククォートして複数ファイルをforで処理しようと思ったら、マッチしないはずのファイルがマッチする

Shell

タイトルがわけわかめな感じですいません。
何分、リテラシーが低いもので。。。
えー。どういうことかと言いますと。

現象

ある2つのディレクトリに置かれた複数ファイルをdiffしたくなりました。
それらは結構多かったので、forでグルグルしようと思いました。
私はオツムが弱いので、forとかは反射的に以下のように確認してしまいます。

# for e in `ls *.el`; do
> echo $e
> done
90anything-complete.el
90anything-complete.elc
anything-ipa.el
anything-ipa.elc
anything-pkg.el
anything-pkg.elc
...
# 

・・・・・・・・・。
え???
何で、el以外のファイルが入ってくるの?シェルって、そんな感じだったっけ?
と、入社したての新人のように狼狽え、深呼吸して以下をすると、

# ls *.el
90anything-complete.el
anything-ipa.el
anything-pkg.el
...
#

el以外は出てこない。うむ。私はボケてはいない。

・・・・・・・・・。
さて。困った。さっっぱしわからんす。。。
しばらく現実逃避したんですが、一向に改善されないので(当たり前だ)
色々試したら、原因はわかりました。

原因

lsのFオプションでした。

Fオプションは、
ディレクトリ名に"/"(スラッシュ)を、実行ファイルに"*"(アスタリスク)、シンボリックリンクに"@"(アットマーク)を付加します。
というのを、初めて知りました。。

私の場合は、どこぞで拾ったrcファイルの設定で、lsにFオプションがエイリアスで設定されていたのでした。
意味を理解せずにコードをパクるな!!!
と、先輩から口をすっぱくして言われたのを思い出しました。
バッククォートで埋め込んだ時だけなんで、今回はそれが原因というわけではないですが。

環境

あとがき

それにしても不思議です。
今まで、それなりにシェルスクリプトは使ってきたつもりですが。
というか、正常に動いているスクリプトがエイリアス設定を変更したら環境破壊する。なんてことが起こり得るってことかな。

何か怖えぇ~