Linux Alpine 3.11의 $PATH에서 SH 스크립트를 찾을 수 없습니다.

Linux Alpine 3.11의 $PATH에서 SH 스크립트를 찾을 수 없습니다.

새로운 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-forshsh: /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.

관련 정보