web-dev-qa-db-ja.com

ログイン直後に「コマンドが見つかりません」というスクリプトを追跡するにはどうすればよいですか?

ログインすると、次のメッセージが表示されます。

-bash: $'\r' : command not found
-bash: $'\r' : command not found
-bash: $'\r' : command not found 

一部の起動スクリプトのWindowsスタイルの行末が原因であることがはっきりしているので、私の質問は、その原因となるスクリプトを追跡できますか?

8
Denis Sablukov

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
5
Kevin_Kinsey

この質問の難しい部分は、「ファイル内で改行を見つけることができるのはなぜですか」ではないと思います。しかし、「自分の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セッションによってファイルが開かれるたびに検索します。しかし、それはさらに重い/ノイズの多いソリューションです。

3
Ben Millwood

もう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秒でエコーします。これにより、エコーの前か後かに応じて、ラインを追跡できます。

3
user394