내 스크립트에는 이라는 함수가 있습니다 messages
. Linux Mint에서 작성했는데 실행하는데 문제가 없었는데 Debian Buster 스테이션으로 옮겼을 때 기능이 /usr/bin/messages
.
스크립트를 호출하는 시작 스크립트가 있습니다 messages
.
시작_스크립트
# call to messages script
. messages
메시지
messages() {
# reformat the arguments and return them
}
나중에 start_script에서
messages "This is a message"
어떤 던지는가
./startup_script: line 35: .: /usr/bin/messages: cannot execute binary file
messages: could not open mailbox `/path/to/my/script/<string passed to my function>': No such file or directory
/usr/bin/messages
그래서 내 함수 대신 호출되는 것과 관련된 많은 오류가 발생합니다 .
을 추가한 후 type messages "This is a message"
관련 출력은 다음과 같습니다.
messages is /usr/bin/messages
함수 이름을 바꿀 수 있는 옵션이 있지만, 이 상황을 처리하는 더 좋은 방법이 있을 수도 있습니다.
시스템 바이너리를 무시하고 자체 기능을 사용하도록 스크립트에 어떻게 지시합니까?
¹ 이 함수는 여러 스크립트에서 여러 번 호출되므로 이름만 변경하는 것이 가장 쉬운 옵션은 아닙니다.
답변1
작동 방식은 다음과 같습니다 . file
.
<슬래시>가 포함되어 있지 않으면
file
쉘은 지정된 검색 경로를 사용하여PATH
파일이 포함된 디렉터리를 찾습니다.
이 행동은POSIX에 의해 지정됨.
첫 번째 오류는 다음과 같습니다
./startup_script: line 35: .: /usr/bin/messages: cannot execute binary file
전화할 때도 비슷합니다 . echo
.
-bash: .: /bin/echo: cannot execute binary file
바이너리 파일의 소스를 얻으려고 합니다 /usr/bin/messages
. 실제로 함수가 정의된 파일은 전혀 소스가 아니며 함수는 현재 스크립트에 정의되어 있지 않습니다. 이는 나중에 messages
여전히 /usr/bin/messages
기능이 아닌 을 의미함을 의미합니다.
관련 줄은 . ./messages
또는 . /full/path/to/messages
(예: 경로)이어야 합니다.당신의파일이 아닌 바이너리).
답변2
오류 메시지 해석
오류 메시지의 줄 번호를 확인하세요.. 이렇게 하면 오류가 발생한 줄을 알 수 있습니다. 35줄이 넘는 스크립트에서 몇 줄을 보여주셨기 때문에 그것은 우리에게 숨겨져 있었습니다.
어떤 파일이 실행됩니까?
. file-to-source
또는 로 파일을 지정하면 file-to-run
환경 변수에 나열된 디렉터리가 $PATH
왼쪽에서 오른쪽으로 검색됩니다. 현재 디렉터리는 보안 위험이 있거나 적어도 혼란스러울 수 있으므로 이 목록에 없습니다. 현재 디렉터리에서 프로그램을 실행하려면 해당 프로그램이 현재 디렉터리에 있음을 지정해야 합니다. 예를 들어 . ./file-to-source
또는 ./file-to-run
(전체 경로를 제공할 필요가 없습니다).
.
이것이 문제라는 것을 깨달을 때까지 Unix는 PATH에 있었습니다 . 예를 들어 ls
현재 디렉토리에 호출되는 프로그램을 넣으십시오 . Microsoft Windows의 CMD는 여전히 .
에 암시적으로 포함 되어 있으므로 PATH
제거할 수 없습니다. 이는 이 OS에서 높은 쇼핑몰웨어의 원인 중 하나입니다.
문제
.
스크립트가 있는 디렉터리가 아닌 현재 작업 디렉터리를 나타냅니다.
이를 해결하려면 다음과 같은 작업을 수행할 수 있습니다.
(
cd "$(dirname "$(readlink -f "$0")")"
script_dir="$(pwd)"
)
script_dir/other_script
누군가가 더 나은 솔루션에 연결할 수 있기를 바랍니다.