이 bash
스크립트는 손상된 것 같습니다.
#!/bin/bash
echo "It prints ok"
cat << 'EOF' > ~/doFoo.sh
echo 'nested script doing Foo'
EOF
echo "It never prints"
cat << 'EOF' > ~/doBar.sh
echo 'nested script doing Bar'
EOF
echo "It never prints too"
# Here there is no doFoo.sh or doBar.sh in ~
ls -l ~/doFoo.sh ~/doBar.sh
스크립트는 첫 번째 메시지( It prints ok
)만 인쇄하고 doFoo.sh'$'\r'
다음 이름의 파일을 생성합니다.
echo 'nested script doing Foo'
EOF
echo "It never prints"
cat << 'EOF' > ~/doBar.sh
echo 'nested script doing Bar'
EOF
echo "It never prints too"
# Here there is no doFoo.sh or doBar.sh in ~
@Jim L. 해당 줄을 추가한 후에도 정확한 출력은 다음과 같습니다.
It prints ok
그게 다야.
답변1
Windows 시스템에서 스크립트를 작성하고 편집기를 사용하여 이를 DOS 텍스트 파일로 저장합니다. 의견에 따르면 nano
Unix 시스템에서 몇 차례 편집을 했다고 합니다. Unix( nano
포함)의 대부분의 텍스트 편집기는 텍스트 파일이 DOS 형식임을 확인하고 나중에 파일을 저장할 때 이 형식을 유지합니다. 예를 들어 nano
편집기를 사용하거나 실행하면 항상 Unix 텍스트 형식으로 저장됩니다.-u
--unix
DOS 텍스트 파일에는 "crlf"(캐리지 리턴 + 줄 바꿈) 줄 바꿈 문자가 있고 Unix 텍스트 파일에는 "lf"(줄 바꿈) 줄 바꿈 문자가 있으므로 Unix 도구로 읽을 때 이제 각 줄에 끝에 캐리지 리턴 문자가 있습니다(표시되지 않지만 일반적으로 ^M
또는 로 인코딩됨 \r
). 이러한 캐리지 리턴은 스크립트의 명령을 방해합니다.
예를 들어, 이는 쉘이 EOF
첫 번째 here 문서의 끝을 찾는 것을 방지합니다.실제로EOF\r
아니 , 아니 라고 말해보세요 EOF
.
cat -v
스크립트에서 사용하면 캐리지 리턴이 표시됩니다.
$ cat -v script
#!/bin/bash^M
echo "It prints ok"^M
cat << 'EOF' > ~/doFoo.sh^M
echo 'nested script doing Foo'^M
EOF^M
echo "It never prints"^M
cat << 'EOF' > ~/doBar.sh^M
echo 'nested script doing Bar'^M
EOF^M
echo "It never prints too"^M
# Here there is no doFoo.sh or doBar.sh in ~^M
Unix를 사용하여 스크립트 파일을 Unix 스크립트 파일로 변환하면 문제가 해결되거나 dos2unix
위에서 설명한 대로 사용하거나 실행한 후 텍스트를 저장하면 됩니다.nano
nano
-u
--unix
$ dos2unix script
dos2unix: converting file script to Unix format...
$ cat -v script
#!/bin/bash
echo "It prints ok"
cat << 'EOF' > ~/doFoo.sh
echo 'nested script doing Foo'
EOF
echo "It never prints"
cat << 'EOF' > ~/doBar.sh
echo 'nested script doing Bar'
EOF
echo "It never prints too"
# Here there is no doFoo.sh or doBar.sh in ~
답변2
문제 설명은 파일을 찾고 싶다는 것을 의미합니다.
doFoo.sh
doBar.sh
홈 디렉토리에 있습니다. 귀하의 스크립트는 이러한 이름을 사용하지 않습니다. cat
스크립트의 명령에 지정된 대로 각 이름 앞에 점을 추가하여 찾고 있는 파일을 찾을 수 있습니다 .
$ cd ~
$ ls -l .do*
-rw------- 1 jim jim 39 Mar 15 14:49 .doBar.sh
-rw------- 1 jim jim 39 Mar 15 14:49 .doFoo.sh
$ cat .doBar.sh
echo 'nested script doing Bar'
$ cat .doFoo.sh
echo 'nested script doing Foo'
편집하다:
echo
첫 번째 문만 실행되고 스크립트는 첫 번째 문에서 cat
실패함을 나타냅니다 . 그러나 게시한 스크립트는 내 컴퓨터에서 작동합니다. 파일에 구문 오류를 일으키지만 StackExchange 게시물에는 표시되지 않는 인쇄할 수 없는/정크 문자가 있을 수 있습니다.
위에 표시된 대로 스크립트를 정확하게 복사하여 붙여넣고 다음 위치에 저장해 보세요.새로운문서:
cat << END > newfile.sh
(paste)
END
chmod +x newfile.sh
./newfile.sh