bashで書いていたシェルスクリプトをzshに持ってきて動かそうとしたらエラーが出て動かない。
そんな難しいことをしているわけでもないのに何故か動かない。
なんで?
その原因は変数展開の仕方の違いにありました。
小ネタですが備忘録として記事化しておきます。
bashとzshの変数展開における空白の扱いが違った件
bashで書いた簡単なスクリプト。
動画をダウンロードするプログラムを起動する為のスクリプトです。
なので基本的にはそのURLと、設定ファイルの場所をパラメータとして渡すだけ。
zshに移行してもそのまま動くだろうと思ったのですが、物の見事に引っかかりました。
エラーを吐いて動いてくれない。
シンプルなだけに意味がわからない。
これで何故動かない・・・
で、色々調べてみたらなんと
bashとzshでは変数に含まれる空白の扱いがデフォルトで違う、ということだったのです。
bashでは変数に空白が含まれていた場合、それを区切り文字として分割、展開されます。
が、zshは分割せず全体を一つの大きな塊として処理します。
つまり
コマンド に URL オプション
と言うそれぞれ空白で区切られたものとして渡したかったものが
コマンド “URL オプション”
という一続きになっていたということ。
そりゃそんなURL無いって言われるわ。
解決法
解決するには SH_WORD_SPLIT オプションを設定するとbashと同じ扱いになるらしい。
setopt SH_WORD_SPLIT
これをスクリプトの先頭の方に追記。
無事動くようになりました。
また ${=VAR} という形にするという方法もあり。
書き直すの面倒だから今回はしないけど。
思わぬ落とし穴でした。
コメント