스크립트를 가져올 때 "/home/user로 CD를 이동할 수 없습니다."

스크립트를 가져올 때 "/home/user로 CD를 이동할 수 없습니다."

이 스크립트가 있습니다.

echo $HOME
cd $HOME
cd /
cd /usr/local/src/

이렇게 달리다 보면

. script.sh

나는 다음과 같은 결과를 얻습니다.

/home/user
: No such file or directory
: No such file or directory
: No such file or directory

정상적으로 실행하면 ( #!/bin/bash첫 번째 줄 앞에 추가합니다)

sh script.sh

나는 다음과 같은 결과를 얻습니다.

: not found.sh: 2: script.sh
/home/user
script.sh: 3: Can't cd to /home/user
script.sh: 4: Can't cd to /
script.sh: 5: Can't cd to /usr/local/src/

$HOME스크립트는 매번 디렉터리에서 실행됩니다. 셸에서 각 명령을 하나씩 실행하면 문제 없이 실행됩니다( cd $HOME내부에서 호출해도 $HOME디렉터리는 전혀 변경되지 않습니다).

이 일을 하려면 어떻게 해야 합니까?

답변1

스크립트에 CR(^M) 문자가 있습니다. Unix 줄 끝(LF만 해당)을 갖도록 변환합니다. 이식 가능한 방식으로:

tr -d '\r' < your_script > output_script

CR 문자에서 발생하는 일에 대한 Olivier Dulac의 의견을 기반으로 한 일부 설명: 첫째, 쉘 언어에서 CR 문자는 특수 문자로 간주되지 않습니다. 예를 들어 공백으로 간주되지 않으며 무시되지 않습니다. 나는 다음과 같이 쓴다 ^M.

  • 이 줄에서는 개행 문자가 뒤따르는 내용이 출력됩니다 echo $HOME^M. CR 문자를 출력하면 커서가 첫 번째 열에 배치되지만 그 뒤에 개행 문자가 오기 때문에 눈에 띄는 효과는 없습니다.$HOME^M

  • cd $HOME^M줄에서는 와 CR 문자 사이에 공백이 없으므로 $HOME둘 다 동일한 매개변수에 있으며 $HOME^M디렉터리가 존재하지 않습니다. 오류 메시지에서 $HOME다음 CR 문자를 인쇄하고 첫 번째 열에 커서를 놓아 줄의 시작 부분이 메시지의 나머지 부분(있는 경우)으로 덮어쓰이도록 합니다. ": 해당 파일 또는 디렉터리가 없습니다." with bash( 첫 번째 예), 대시 없음(두 번째 예는 sh script.sh스크립트 #!/bin/bash실행을 명시적으로 요청했기 때문에 무시됩니다 sh. 귀하의 경우에는 대시로 표시됩니다). 오류 메시지는 전적으로 쉘에 따라 다릅니다. 예를 들어, zsh는 CR 문자가 인쇄 가능하지 않음을 감지하고 다음 메시지를 인쇄합니다.

    CD: 해당 파일이나 디렉터리가 없습니다: /usr/local/src/^M

(CR 문자 대신 "^" 및 "M" 문자를 사용하십시오.) 그러면 사람들이 문제의 원인을 더 쉽게 찾을 수 있습니다. 그렇지 않으면 cat -veOlivier가 제안한 특수 문자를 표시할 수 있는 일부 유틸리티 또는 hd스트림의 바이트 시퀀스를 제공하는 로 stderr를 리디렉션/파이프해야 합니다 .

답변2

다음을 사용하면 set -x파일 가져오기가 실패하는 이유를 알 수 있습니다 .

$ . test.sh
+ . test.sh
++ echo $'/home/braiam\r'
/home/braiam
++ cd $'/home/braiam\r'
: No such file or directory
++ cd $'/\r'
: No such file or directory
++ cd $'/usr/local/src/\r'
: No such file or directory

vinc17이 말했듯 \r이 스크립트의 일부를 제거하십시오. 당신은 그것을 사용할 수 있습니다그의 해결책, 또는 dos2unix script.sh다음을 사용합니다.sed -i 's/\r//' script.sh

답변3

다음 명령을 사용하여 CR 문자를 제거할 수도 있습니다.

perl -p -i -e "s/\r//g" script.sh

당신이 사용하는 경우/, 당신은 이것을 할 수 있습니다

:set ff=unix

답변4

저도 같은 문제가 있어서 EOL 문자를 UNIX 형식으로 변환하여 문제를 해결했습니다. 간단한 방법은 다음과 같습니다.

  • Notepad++에 파일 로드
  • 변환할 모든 텍스트 선택(Ctrl + A)
  • 편집 > EOL 변환 > UNIX
  • 문서 저장

이미 UNIX 형식인 경우 다른 형식(Windows)을 선택한 다음 UNIX로 돌아갑니다.

관련 정보