質問: **現象** WSL2のUbuntuのbashで`npm install vue`を実行したときに、`-bash: /mnt/c/Program Files/nodejs/npm: /bin/sh^M: bad interpreter: No such file or directory`が出現する そこで、`cat -e /bin/sh`コマンドを使って、改行コードを確認しようとすると、出力された物が全て文字化けしてしまっている **期待値** `cat -e /bin/sh`コマンドを使って、改行コードを確認したい **再現手順** 1. node.jsをインストールする 2. npmをインストールする 3. `npm install vue`を実行する 4. すると、`-bash: /mnt/c/Program Files/nodejs/npm: /bin/sh^M: bad interpreter: No such file or directory`が出現する 5. 改行コードを調べるために、`cat -e /bin/sh`を実行する **参考リンク** /bin/bash^M: bad interpreter: そのようなファイルやディレクトリはありません (No such file or directory)
回答: なんか限りなく XY 問題な気がしますが > > `cat -e /bin/sh` コマンドを使って、改行コードを確認したい > > > あなたが確認したいのは `/mnt/c/Program Files/nodejs/npm` の改行コードであって `/bin/sh` の改行コードではないはず。 > > 文字化け > > > そりゃバイナリファイルである `/bin/sh` をコンソールに表示すれば化けているに決まっています。 `/bin/sh^M: bad interpreter` のメッセージはシェルスクリプトファイルの1行目 `shebang` (シバンともシェバンとも) の改行コードが `CR LF` かつ、そのシバンを解釈する何か ( execve カーネル関数と `/bin/sh` の合わせ技なんだけど) が LF 改行のみ対応の場合に `#!/bin/sh` のシバン行を `/bin/sh` なファイルを起動すると解釈し、そんなファイルはないのでエラーになるという現象です。なのであなたのところで発生したそのエラーメッセージの原因は `/mnt/c/Program Files/nodejs/npm` のシバン行の改行コードが `CR LF` であることです。 `/bin/sh` 側ではありません。 なので使うツールも確認する対象ファイルも違うっス。こういう場合は普通 `file` なり `od` なりで確認すればいいです。ウチの WSL2 Ubuntu 20.04 TLS の場合 ``` $ file /bin/sh /bin/dash abc.sh /bin/sh: symbolic link to dash /bin/dash: ELF 64-bit LSB shared object, x86-64, <以下略> abc.sh: POSIX shell script, ASCII text executable, with CRLF terminators $ od -tx1 abc.sh 0000000 23 21 2f 62 69 6e 2f 73 68 0d 0a 65 63 68 6f 20 0000020 61 62 63 0d 0a 0000025 $ ./abc.sh abc $ ``` ってことで追及すべきはなぜ `npm` コマンドの内部改行コードが `CR LF` なのか、だけどその辺は別途コメントにある通りなのだろうと思われます。 まあシバン評価するルーチン( [linux](/questions/tagged/linux "'linux' のタグが付いた質問を表示") kernel ですね)側が改行コード `CR LF` に対応してくれていればいいだけですし、オイラんところの Ubuntu 20.04 TLS ストア更新日 2021/06/12 では前述のとおりシバン行の改行が `CR LF` である `abc.sh` も期待通り動いているわけで、質問者さんもストアアプリの更新で WSL2 Ubuntu を更新すればそのまま動くかもしれないです。