이 스크립트가 "실행할 수 없음" 분기에 멈춰 있는 이유는 무엇입니까?

이 스크립트가 "실행할 수 없음" 분기에 멈춰 있는 이유는 무엇입니까?

저는 제어판 제조사에서 제공하는 이 도구를 사용하고 있습니다.

지침을 단계별로 따랐지만 예제 코드를 컴파일하려고 하면 if 절의 "$basename을 실행할 수 없습니다" 분기에서 컴파일 프로세스가 중단되었습니다.

저는 bash 스크립팅의 마법사가 아니기 때문에 제가 무엇을 보고 있는지 모르겠습니다.

#!/bin/bash

# uclibc-toolchain-wrapper




basename=$0

if [ -d $basename ]
then
    echo "This can't be a directory."
    exit 1;
fi

tool_name=${basename##*/}
if [[ $tool_name =~ "mips-linux-uclibc-gnu" ]]
then
    prefix=${basename%-uclibc-*}
    postfix=${basename##*mips-linux-uclibc}
    $prefix$postfix "-muclibc" $@
else
    echo "$basename can't execute."
    exit 1;
fi

그러면 이 스크립트를 롤링하려면 어떻게 해야 합니까?

사용자 매뉴얼에는 툴체인을 "설치"하기 위해 환경 변수를 수정하라고 나와 있습니다. 여기에는 기본적으로 .bashrc의 "PATH" 변수에 지정된 경로를 추가하는 작업이 포함됩니다. 물론 전체 툴체인을 지정된 폴더에 배치했습니다.

소스 폴더에 "make" 명령을 입력하면 툴체인이 호출되는 것처럼 보이지만 "uclibc-toolchain-wrapper를 실행할 수 없습니다." 오류가 인쇄되면서 이 스크립트에서 실행이 중지됩니다. 여기서 "uclibc-toolchain-wrapper"는 스크립트의 파일 이름입니다.

나는 lubuntu 13, ubuntu 22, Debian 5에서 시도해 보았고 모두 같은 결과를 얻었습니다.

도와주세요! 미리 감사드립니다!

답변1

스크립트 시작 부분에서 "이 스크립트가 실행될 이름(디렉터리 경로 포함)" $basename과 동일하게 설정합니다 .$0

cc1-mips-linux-uclibc-gnu이 스크립트의 분명한 목적은 컴파일러의 첫 번째 단계 와 같은 여러 다른 이름에 연결/복사하는 것입니다 . 해당 이름으로 실행되면 명령을 다시 정렬 cc1-mips-linux-gnu -muclibc <script parameters>하고 실행을 시도합니다.

이를 통해 툴체인 패키지에는 다음과 같은 이름을 가진 여러 실행 가능한 도구가 포함될 수 있는 것으로 보입니다.

<tool name>-mips-linux-gnu<possible suffix>

이 래퍼는 다음과 같이 연결될 수 있습니다.

<tool name>-mips-linux-uclibc-gnu<possible suffix>

각 도구에 대해 부품을 포함하는 긴 형식의 도구 이름이 허용됩니다 -uclibc-.

ls -lF툴체인 실행 파일이 포함된 디렉터리에서 실행하는 경우 다음과 같은 심볼릭 링크가 표시될 수 있습니다.

cc1-mips-linux-uclibc-gnu -> uclibc-toolchain-wrapper
<some tool>-mips-linux-uclibc-gnu -> uclibc-toolchain-wrapper
<another tool>-mips-linux-uclibc-gnu -> uclibc-toolchain-wrapper
...

그리고 동일한 디렉터리나 툴체인 패키지의 다른 곳에는 다음 이름의 실행 파일이 있습니다.

cc1-mips-linux-gnu
<some tool>-mips-linux-gnu
<another tool>-mips-linux-gnu
...

etc. 등은 잘 알려진 컴파일러/링커 구성 요소 이름이거나 <some tool>기타 도구일 수 있습니다.<another tool>cppld


그러나 실행 시 수신되는 문자 그대로의 오류 메시지가 다음과 같은 make경우

uclibc-toolchain-wrapper can't execute

글쎄요, 스크립트는 단지 로 실행되고 있음을 감지합니다 uclibc-toolchain-wrapper. 이는 잘못된 것입니다. 스크립트는 string 을 포함하는 모든 이름으로 호출될 것으로 예상합니다 mips-linux-uclibc-gnu. 이는 실제로 실패할 경우 "$basename을 실행할 수 없습니다." 오류 메시지를 발생시키는 테스트입니다.

툴체인 패키지를 Unix 계열이 아닌 파일 시스템(예: NTFS)에 추출하고 거기에서 실행해 보셨나요? 이러한 파일 시스템에서 심볼릭 링크 의미 체계는 Unix 계열 파일 시스템과 다르게 작동할 수 있습니다. 이는 스크립트가 스크립트를 실행하는 데 사용된 심볼릭 링크의 원래 이름을 가져오는 데 실패하고 uclibc-toolchain-wrapper대신 script( )의 실제 이름을 가져오는 이유를 설명할 수 있습니다. 이 경우 수정 방법은 툴체인 패키지를 실제 Unix 계열 파일 시스템으로 다시 추출하여 거기에서 사용하는 것입니다.

또는 Makefile이 실제로 이름을 사용하여 스크립트를 호출하는 경우 uclibc-toolchain-wrapperMakefile은 어리석거나 어떤 방식으로든 잘못 구성된 것입니다.

관련 정보