bashとzsh変数展開の違い(変数内にある空白での分割について

コンピュータ関連
スポンサーリンク

bashで書いていたシェルスクリプトをzshに持ってきて動かそうとしたらエラーが出て動かない。

そんな難しいことをしているわけでもないのに何故か動かない。

なんで?

その原因は変数展開の仕方の違いにありました。

小ネタですが備忘録として記事化しておきます。

スポンサーリンク

bashとzshの変数展開における空白の扱いが違った件

bashで書いた簡単なスクリプト。
動画をダウンロードするプログラムを起動する為のスクリプトです。

なので基本的にはそのURLと、設定ファイルの場所をパラメータとして渡すだけ

zshに移行してもそのまま動くだろうと思ったのですが、物の見事に引っかかりました。

エラーを吐いて動いてくれない。
シンプルなだけに意味がわからない。

これで何故動かない・・・

で、色々調べてみたらなんと

bashとzshでは変数に含まれる空白の扱いがデフォルトで違う、ということだったのです。

bashでは変数に空白が含まれていた場合、それを区切り文字として分割、展開されます。

が、zshは分割せず全体を一つの大きな塊として処理します。

つまり

コマンド に URL オプション

と言うそれぞれ空白で区切られたものとして渡したかったものが

コマンド “URL オプション”

という一続きになっていたということ。

そりゃそんなURL無いって言われるわ。

解決法

解決するには SH_WORD_SPLIT オプションを設定するとbashと同じ扱いになるらしい。

setopt SH_WORD_SPLIT

これをスクリプトの先頭の方に追記。
無事動くようになりました。

また ${=VAR} という形にするという方法もあり。

書き直すの面倒だから今回はしないけど。

思わぬ落とし穴でした。

コメント

タイトルとURLをコピーしました