ログインすると、次のメッセージが表示されます。
-bash: $'\r' : command not found
-bash: $'\r' : command not found
-bash: $'\r' : command not found
一部の起動スクリプトのWindowsスタイルの行末が原因であることがはっきりしているので、私の質問は、その原因となるスクリプトを追跡できますか?
file(1)もここで役立ちます。
$file *
signin: Python script, ASCII text
signup: Python script, ASCII text, with CRLF line terminators
site_off.htm: XML 1.0 document, ASCII text
sitemaps: directory
signup
では、厄介なWindows CRLFの行末を削除する必要があることがわかります。
/home/username
のような再帰的な場合は、おそらくfind
およびxargs
(およびgrepも)と組み合わせることができます。
$ find . | xargs file | grep CR
./foo_data/V: ASCII text, with CR, LF line terminators
./foo_data/Y: ASCII text, with CR, LF line terminators
この質問の難しい部分は、「ファイル内で改行を見つけることができるのはなぜですか」ではないと思います。しかし、「自分のbashrcが使用しているファイルを見つけるにはどうすればよいですか?」
2番目の質問については、次のようなことを試すことができます。
bash -x .bashrc
これにより、すべてが参照するすべてのファイルを含め、bashrcが実行することがわかります。うるさいですが、使用されているファイルを追跡するのに役立ちます。
実際には、私の(および他の多くの).bashrc
ファイルは、インタラクティブに実行しないと早期に終了するため、チェックを通過させるようにファイルをだます必要があります。
bash -ix .bashrc
ここで-i
は対話モードを強制します。
あなたがファイルをソースするケースだけをgrepするために、このようなものは私にとってはうまくいきますが、正規表現がすべてをキャッチすることを約束することはできません:
bash -ix .bashrc 2> >(grep -E '^\+* (\.|source)')
エラーメッセージが必要になることもあるので、次のようにします。
bash -ix .bashrc 2> >(grep -E -e '^\+* (\.|source)' -e 'command not found')
何らかの理由でこれがうまくいかなかった場合は、strace -e open bash
またはそのようなもので、bashセッションによってファイルが開かれるたびに検索します。しかし、それはさらに重い/ノイズの多いソリューションです。
もう1つの方法は、前述の起動スクリプトをすべて取得し、それぞれの開始時にそれぞれを識別する文字列をエコーすることです。
$ head .bashrc
echo "Running bashrc"
次に、ログインすると、次のようなものが表示されます。
running bashrc
running bash_aliases
-bash: $'\r' : command not found
-bash: $'\r' : command not found
-bash: $'\r' : command not found
running something_else
その時点で、それを結論付けることができます(上記の例では).bash_aliases
には問題の行末が含まれています。
ファイルを特定しても問題のある行がすぐに表示されない場合は、同じ方法を使用して行を追跡できます。ファイルの途中でメッセージをエコーし、出力に応じて3/4または1/4秒でエコーします。これにより、エコーの前か後かに応じて、ラインを追跡できます。