오류 메시지를 설명하세요.

오류 메시지를 설명하세요.

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

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

관련 정보