ログインすると、次のメッセージが表示されます。
-bash: $'\r' : command not found
-bash: $'\r' : command not found
-bash: $'\r' : command not found
一部の起動スクリプトのWindowsスタイルの行末が原因であることが明らかであるため、私の質問は、それを引き起こすスクリプトを追跡できますか?
ログインすると、次のメッセージが表示されます。
-bash: $'\r' : command not found
-bash: $'\r' : command not found
-bash: $'\r' : command not found
一部の起動スクリプトのWindowsスタイルの行末が原因であることが明らかであるため、私の質問は、それを引き起こすスクリプトを追跡できますか?
回答:
Bashは、起動方法にもよりますが、起動時にさまざまなファイルを読み取ります(説明については、マニュアルを参照してください)。次に/etc/profile.d/
、シェルによって直接読み取られないようなものがありますが、多くのディストリビューションの他のスタートアップファイルから参照できます。
あなたはそれらすべてを通過する必要がありますが、幸運にも、grep
キャリッジリターンのためだけにできます。たとえば次のようなものを試してください:
grep $'\r' ~/.bashrc ~/.profile ~/.bash_login ~/.bash_profile /etc/bash.bashrc /etc/profile /etc/profile.d/*
参照どのファイルが環境変数に設定/追加されているか、およびそれらの優先順位を見つけることは可能ですか?同様の問題のため。
~/.bash_aliases
ここでも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
and 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
もう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までエコーします。こうすることで、エコーの前か後かによって、ラインを追跡できます。
この質問の難しい部分は、「ファイル内の改行を見つけるにはどうすればよいですか」ではないと思います。しかし、「自分のbashrcが使用するファイルを見つけるにはどうすればよいですか?」
2番目の質問については、次のようなことを試すことができます。
bash -x .bashrc
これにより、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セッションによってファイルが開かれるたびに見つけるために、またはそれに似た方法を使用します。しかし、それはさらに重い/ノイズの多いソリューションです。