이 스크립트가 있습니다.
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 -ve
Olivier가 제안한 특수 문자를 표시할 수 있는 일부 유틸리티 또는 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로 돌아갑니다.