shebang ('#!’) の謎のエラー とhex dump
概略
改行が0d 0aだと、macosではshebang ('#!’)でエラーになる...(知らなかった)
詳細
- Pythonのプログラムを実行すると↓のエラーが出る
env: python\r: No such file or directory
- shebangの行でエラーみたいだが、ふつーに↓の通りである
#!/usr/bin/env python # coding: utf-8 ...
- env: python\r の\rが当然、気になるのでhexダンプすると…
0000000 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70 0000010 79 74 68 6f 6e 0d 0a 23 20 63 6f 64 69 6e 67 3a
- …のように改行が0d 0aになってるせいみたいだ。こんなエラーが出るとは知らなかった。どっかで改行コードが変わってた。実はメールの添付で送ったプログラムの改行コードが変わっていたのだが、その理由は... ->参照 「Gmailのウイルス・スキャンが、textの改行コード0aを0d 0aに勝手にしている」
- 原因を探るより、hexダンプするためのodのオプションを思い出すのに時間がかかった。
$ od -tx1 -Ax foo.py 0000000 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70 0000010 79 74 68 6f 6e 0d 0a 23 20 63 6f 64 69 6e 67 3a ...
- そもそもhexdumpってコマンドあるんだった。ASCIIも出したかったら、-C。
$ hexdump foo.py 0000000 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70 0000010 79 74 68 6f 6e 0a 23 20 63 6f 64 69 6e 67 3a 20 ... $ hexdump -C foo.py 00000000 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70 |#!/usr/bin/env p| 00000010 79 74 68 6f 6e 0a 23 20 63 6f 64 69 6e 67 3a 20 |ython.# coding: | ...
- ついでに、xxdってuuencode/uudecodeのhex版みたいのがあるのを思い出した。xxdの-g1ってオプションはなかなか覚えられない。
$ xxd -g1 cinedata.py 00000000: 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70 #!/usr/bin/env p 00000010: 79 74 68 6f 6e 0a 23 20 63 6f 64 69 6e 67 3a 20 ython.# coding: ...
- まあ、デバックだけだったらhexdumpを覚えておけばいいかな。