소스에서 "바이너리 파일을 실행할 수 없습니다"라는 오류가 발생하는 이유는 무엇입니까?

소스에서 "바이너리 파일을 실행할 수 없습니다"라는 오류가 발생하는 이유는 무엇입니까?

tmux세션을 초기화한 다음 일부 창을 만드는 작은 파일이 있습니다 . 일부 디버깅 및 조정 후 다음 에서 텍스트 파일 이름을 변경할 때까지 모든 것이 잘 작동했습니다(명령 사용 tmux) .spamxset

$ source xset
bash: source: /usr/bin/xset: cannot execute binary file

이제 파일 이름을 다시 바꾸었고 source spam다시 작동하지만 이유를 알고 싶습니다. 파일은 .dll 파일이 아닌 내 홈 디렉터리에 있습니다 /usr/bin.

답변1

bash내부 명령 소스는 파일 이름에 슬래시( )가 없는 한 먼저 PATH에서 파일 이름을 찾습니다 . PATH의 실행 파일이므로 문제가 됩니다./xset

다음 명령을 실행 source ./xset하거나 sourcepath 옵션을 off로 변경할 수 있습니다.

shopt -u sourcepath

bash매뉴얼 페이지 에서 :

      source filename [arguments]
          Read and execute commands from filename  in  the  current  shell
          environment  and return the exit status of the last command exe‐
          cuted from filename.  If filename does not contain a slash, file
          names  in  PATH  are used to find the directory containing file‐
          name.  The file searched for in PATH  need  not  be  executable.
          When  bash  is  not  in  posix  mode,  the  current directory is
          searched if no file is found in PATH.  If the sourcepath  option
          to  the  shopt  builtin  command  is turned off, the PATH is not
          searched.  If any arguments are supplied, they become the  posi‐
          tional  parameters  when  filename  is  executed.  Otherwise the
          positional parameters are unchanged.  The return status  is  the
          status  of  the  last  command exited within the script (0 if no
          commands are executed), and false if filename is  not  found  or
          cannot be read.

답변2

이것source명령은:

다음에서 명령을 읽고 실행합니다.파일 이름현재 쉘 컨텍스트의 매개변수입니다. 만약에파일 이름슬래시가 없으면 이 PATH변수를 사용하여 다음을 찾습니다.파일 이름.

그런 행동.POSIX에 의해 정의됨(별칭). 왜? 음, 거기에 가져올 수 있는 구성 스크립트를 넣고 PATH경로를 한정하지 않고도 액세스할 수 있습니다. 필요한 파일에 액세스하려면 절대 또는 상대 경로를 제공하십시오.

source ./xset
source ~/xset
source /home/shawn/xset

위의 모든 작업은 처음에 예상한 대로 작동합니다. sourcepath비활성화 할 수도 있습니다 .shopt.

관련 정보