오류 메시지 해석

오류 메시지 해석

내 스크립트에는 이라는 함수가 있습니다 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

누군가가 더 나은 솔루션에 연결할 수 있기를 바랍니다.

관련 정보