これは Linux Advent Calendar 2020 の14日目の記事である。13日目はSumi-Sumiさんの 「windows in ArchLinuxで無線フルトラする」だった。「フルトラ」って「フルトラッキング」の略なのかな……VR分かんないマンなので、よく分からない。
Linux Advent Calenar、今回、(ノリとイキオイで)初めて参加したのだが、13日目迄の記事のレベルが総じて高い。ヤバい……昨年迄の分を見てレベルを確認しておけば良かった……と思っても既に後の祭り。小ネタで申し訳ないが、ちょっとしたティーブレイクという事で、ここは一つ……
閑話休題。*nix系のOSには、Windowsには無い素敵な機能が在る。そう、shebangである。ファイルの1行目に、#!
に続けて、そのファイルの内容を解釈するプログラムのパスを書いて、実行パーミッションを付与しておけば、宛ら実行可能バイナリファイルのように振る舞ってくれる。
shebangの挙動は、 Git for Windows に付属しているBashでも再現されている。 Git Bash 上ではLinuxのファイル階層が再現されているので、Windows上でBashのスクリプトを開発する事も、まぁ可能だ。
さて、先日、 Git Bash 上で動作確認を行ったBashスクリプトファイルをLinux上に持っていくと、エラーが発生するという現象に遭遇した。エラーメッセージは次の通り。
-bash: ./script.sh: /bin/bash^M: 誤ったインタプリタです: そのようなファイルやディレクトリはありません
……bash
のパスの末尾に^Mがくっついている。これでピンとくる人も居るだろう。そう、改行コードがCRLFだったのが問題だった。
Windowsの既定の改行コードがCRLFであるのに対し、*nix系OSではLFが採用されている。CR部分が改行コードの一部ではなく、shebangに指定されたパスの一部とみなされた為にエラーが生じてしまったのである。
この、改行コードがCRLFのBashスクリプト、 Git Bash では問題なく動作する。 Git Bash では動いたからと、本物のLinux上でも動作すると思い込んでしまったのが敗因であった。確かに、「改行コードは何か」はOSに依存する事柄と考える事が出来る為、Windows上で動作している Git Bash では問題なく、Linux上では問題となるというのは、納得できる動作ではある。とはいえ、なかなかに罠っぽい。
因みに、WSL2上のUbuntuで確認すると、通常のLinux同様エラーとなった。WSL2を表す表現として、「Windows上で動作する完全なLinux環境」と言う類の物をよく見かけるが、なかなか的を得ている物なのかもしれない。