새로운 Docker 컨테이너에 Alpine Linux 3.11을 사용하고 있습니다.
$PATH
내용이 다음과 같은 기본 변수가 있습니다 .
echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
wait-for
스크립트 (로 시작하는 쉘 스크립트 #!/bin/sh
) 를 넣으면 /usr/local/bin
정상적으로 표시됩니다.
chmod +x wait-for
mv wait-for /usr/local/bin/wait-for
ls -l /usr/local/bin/wait-for
생산하다:
-rwxr-xr-x 1 root root 1451 May 1 16:09 /usr/local/bin/wait-for
sh /usr/local/bin/wait-for
실행하는 데 사용할 때도 실행됩니다.
그러나 들어가서 /usr/src/
달리려고 wait-for
하면sh: wait-for: not found
제가 이해한 바에 따르면 /usr/local/bin
디렉터리는 해당 디렉터리에 있으므로 $PATH
모든 스크립트는 전역적으로 호출되어야 합니다.
내가 뭘 잘못 이해했나요?
/usr/src/
을 사용하면 파일을 실행할 수 있지만 접두사 없이 sh /usr/local/bin/wait-for
사용하면 실행이 불가능합니다 ./usr/local/bin/wait-for
sh
sh: /usr/local/bin/wait-for: not found
출력은 /etc/fstab
다음과 같습니다
/dev/cdrom /media/cdrom iso9660 noauto,ro 0 0
/dev/usbdisk /media/usb vfat noauto,ro 0 0
답변1
귀하의 대화형 쉘은 dash
(인 척 sh
)입니다. 쉘이 dash
말한다
sh: /usr/local/bin/wait-for: not found
스크립트를 실행하려고 할 때 스크립트에 #!
찾을 수 없는 인터프리터를 가리키는 오류 줄이 포함되어 있는 경우. 그것발생하다입력한 명령을 찾을 수 없을 때 발생하는 것과 똑같은 오류이므로 문제라고 생각하기 쉽습니다 $PATH
(이 경우는 아닙니다). 다른 쉘에는 더 많은 정보를 제공하는 오류 메시지가 있습니다( bash
그리고 zsh
"잘못된 해석기: 해당 파일이나 디렉토리가 없습니다"를 표시하고 실행하려는 해석기가 무엇인지 알려줍니다).
~부터파일이 DOS 텍스트 파일입니다., -line 은 DOS 텍스트 파일의 줄 종결자의 일부인 캐리지 리턴 문자의 일반적인 표현인 where를 #!
사용하여 스크립트를 실행하도록 쉘에 지시합니다 . Unix 시스템에서 캐리지 리턴 문자는 "일반 문자"이며 줄 종료의 일부가 아닙니다. 즉, 스크립트 실행을 시작하려고 시도한 다음 파일이 존재하지 않기 때문에 실패합니다. 그러므로 그것은/bin/sh\r
\r
/bin/sh\r
통역사스크립트 자체가 아니라 "찾을 수 없음"입니다.
스크립트 실행분명히인터프리터는 항상 #!
-line을 우회하므로 이를 수행할 때 오류가 발생하지 않습니다. 그러나 스크립트의 각 줄 끝에는 여전히 캐리지 리턴이 있으므로 경우에 따라 스크립트가 오작동할 수 있습니다.
파일을 Unix 텍스트 파일로 다시 저장하거나 를 사용하여 변환 dos2unix
하면 문제가 해결됩니다.
답변2
이것을 찾는 사람들에게 내 특정 문제는 내 wait-for
스크립트가 Windows 줄 끝으로 변환된다는 것입니다.
이 문제는 Unix 줄 끝으로 다시 저장할 때 해결됩니다.
누군가 Windows 줄 끝으로 인해 파일이 사용될 때만 인식되는 이유를 설명하는 더 나은 답변을 게시할 수 있다면 그렇지 않은 sh /usr/local/bin/wait-for
경우 수락 /usr/local/bin/wait-for
하겠습니다 wait-for
.