로그인 후 즉시 "명령을 찾을 수 없음"을 표시하는 스크립트를 추적하려면 어떻게 해야 합니까?

로그인 후 즉시 "명령을 찾을 수 없음"을 표시하는 스크립트를 추적하려면 어떻게 해야 합니까?

로그인하면 다음 메시지가 나타납니다.

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

분명히 이는 일부 시작 스크립트의 Windows 스타일 줄 끝으로 인해 발생하므로 내 질문은 다음과 같습니다. 어떤 스크립트가 문제를 일으키는지, 어떻게 추적할 수 있습니까?

답변1

Bash는 시작 방법에 따라 시작 시 다양한 파일을 읽습니다(설명서의 설명을 참조하세요). /etc/profile.d/셸에서 직접 읽지 않지만 많은 배포판의 다른 시작 파일에서 참조할 수 있는 비슷한 내용이 있습니다 .

이 모든 작업을 수행해야 하지만 운 좋게도 grepEnter 키를 누르기만 하면 됩니다. 예를 들면 다음과 같습니다.

grep $'\r' ~/.bashrc ~/.profile ~/.bash_login ~/.bash_profile /etc/bash.bashrc /etc/profile /etc/profile.d/*

당신은 또한 볼 수 있습니다환경변수에 어떤 파일이 설정/추가되는지, 우선순위를 알 수 있나요?비슷한 질문에 대해서는.

답변2

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 줄 끝을 제거해야 할 필요성을 알 수 있습니다 .

직접 재귀의 경우 and(및 grep) 와 결합 /home/username할 수 있습니다 .findxargs

$ 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

답변3

또 다른 접근 방식은 언급된 모든 시작 스크립트를 가져와서 각 스크립트의 시작 부분에 각 스크립트를 식별하는 문자열을 표시하는 것입니다.

$ 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초 후에 에코합니다. 이렇게 하면 에코 이전 또는 이후에 에코되는지 여부에 따라 선을 추적할 수 있습니다.

답변4

이 질문의 어려운 부분은 "파일에서 캐리지 리턴을 어떻게 찾을 수 있습니까?"가 아니라 "내 bashrc가 사용하는 파일을 어떻게 찾을 수 있습니까?"라고 생각합니다.

두 번째 질문에는 다음과 같이 시도해 볼 수 있습니다.

bash -x .bashrc

이것은 당신에게 보여줄 것입니다모든 것참조하는 모든 파일을 포함하여 bashrc가 수행합니다. 시끄럽지만 어떤 파일이 사용되고 있는지 추적하는 데 도움이 됩니다.

그러나 실제로 .bashrc내 파일(및 기타 많은) 파일은 대화형으로 실행되지 않으면 일찍 종료되므로 해당 검사를 통과하도록 속여야 합니다.

bash -ix .bashrc

-i병력 상호작용 모드 입니다 .

소스 파일만 찾으려면 다음과 같은 방법이 나에게 효과적이었지만 정규 표현식이 모든 것을 포착한다고 보장할 수는 없습니다.

bash -ix .bashrc 2> >(grep -E '^\+* (\.|source)')

다음과 같은 오류 메시지를 원할 수도 있다고 생각합니다.

bash -ix .bashrc 2> >(grep -E -e '^\+* (\.|source)' -e 'command not found')

어떤 이유로든 이들 중 아무것도 작동하지 않으면 strace -e open bashbash 세션이 파일을 열 때마다 찾기 위해 이와 같은 방법을 사용합니다. 그러나 이것은 더 무겁고 더 시끄러운 솔루션입니다.

관련 정보