내 스크립트에는 이라는 함수가 있습니다 messages
. 리눅스 민트에서 작성해서 문제없이 실행했는데, 데비안 버스터 스테이션으로 옮겼을 때 기능은 /usr/bin/messages
.
다음을 호출하는 시작 스크립트가 있습니다 messages
.
시작 스크립트
# call to messages script
. messages
정보
messages() {
# reformat the arguments and return them
}
나중에 스크립트 시작
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
(전체 경로를 제공할 필요 없음)입니다.
유닉스는 .
그것이 문제라는 것을 깨달을 때까지 PATH를 가지고 있었습니다. 예를 들어, ls
현재 디렉터리에 라는 프로그램을 배치합니다 . Microsoft Windows의 CMD는 여전히 .
암시적이므로 PATH
제거할 수 없습니다. 이것이 이 운영 체제에 악성 코드가 많이 존재하는 이유 중 하나입니다.
함정
.
스크립트가 있는 디렉터리가 아닌 현재 작업 디렉터리를 나타냅니다.
이 문제를 해결하려면 다음과 같이 할 수 있습니다.
(
cd "$(dirname "$(readlink -f "$0")")"
script_dir="$(pwd)"
)
script_dir/other_script
누군가가 더 나은 솔루션에 연결할 수 있기를 바랍니다.