電子竹林:Blog2

Tech関係、はてなダイアリーから移転済み...

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を覚えておけばいいかな。