내 $PATH는 다음과 같습니다.
/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux:/home/torbjorr/deployed/typewriter/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mustudio/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mathext/x86_64-GNU%2fLinux:/home/torbjorr/deployed/doxymax/x86_64-GNU%2fLinux:/home/torbjorr/deployed/c2tex/x86_64-GNU%2fLinux:/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand:/home/torbjorr/deployed/x86_64-GNU%2fLinux/spellesc:/home/torbjorr/deployed/x86_64-GNU%2fLinux/projinit:/home/torbjorr/deployed/x86_64-GNU%2fLinux/herbs:/home/torbjorr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Bash에서는 다음 위치에 있는 명령을 호출할 수 있습니다.
/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand
좋다
$ wand
(i) Mål från "main.cpp" har registrerats
(i) Skapar katalog "__wand_targets_dbg"
(i) Kör g++ "main.cpp" -fpic -L"/home/torbjorr/deployed" -g -Wall -std=c++11 -I"/home/torbjorr/deployed" -o "__wand_targets_dbg/cb-template
그러나 Bourne Shell 호환 모드에서는 지팡이를 찾을 수 없습니다.
$ wand
sh: 2: wand: not found
문제는 이 경로의 % 기호인 것 같습니다. 기호는 URL 인코딩을 통해 추가되었으므로 "GNU/Linux"라는 이름은 유효한 파일 이름이 아니더라도 디렉터리 이름에 사용할 수 있습니다. sh에서 이름이 작동하도록 만들거나 sh 명령을 bash처럼 작동하게 만드는 것이 가능합니까? 즉, bash는 bash와 상관없이 심볼릭 링크된 /bin/sh 명령을 사용하여 호출하더라도 동일하게 동작합니다.
답변1
이것은 Bourne 쉘도 아니고 bash
Bourne 쉘의 에뮬레이션도 아니지만 Almquist 쉘입니다. 귀하의 경우에는 Debian Almquist 쉘일 수 있습니다(Debian의 BSD sh는 원래 Almquist 쉘의 Linux 포크를 기반으로 합니다).
Almquist 셸(원본 및 최신 버전)에서는 문서에서 인용 %
:PATH
ash
경로 검색
명령을 찾을 때 쉘은 먼저 해당 이름의 쉘 함수가 있는지 확인합니다. 그런 다음 PATH에 항목이 없으면
%builtin
해당 이름으로 내장 명령을 찾습니다. 마지막으로 PATH의 각 항목에서 해당 명령을 차례로 검색합니다.PATH 변수의 값은 콜론으로 구분된 일련의 항목이어야 합니다. 각 항목은 디렉토리 이름 또는 디렉토리 이름 뒤에 퍼센트 기호로 시작하는 플래그로 구성됩니다. 현재 디렉터리는 빈 디렉터리 이름으로 표시되어야 합니다. 백분율 기호가 없으면 이 항목은 쉘이 지정된 디렉토리에서 명령을 검색하도록 합니다. 이 플래그가 yes이면
%builtin
쉘 내장 명령 목록이 검색됩니다. 플래그가 이면%func
디렉토리에서 쉘에 대한 입력으로 읽을 파일을 검색합니다. 이 파일은 검색 중인 명령의 이름을 가진 함수를 정의해야 합니다.슬래시가 포함된 명령 이름은 위의 검색을 수행하지 않고 간단히 실행됩니다.
다른 쉘은 유사한 기능 자동 로딩 메커니즘을 갖고 ksh
있지만 zsh
다른 변수( )를 사용 $FPATH
하지만 어떤 함수나 실행 파일이 우선할지 정의할 수 없습니다.
귀하의 경우에는 플래그 가 있는 디렉토리 /home/torbjorr/deployed/vector/x86_64-GNU%2fLinux
로 해석됩니다 . 이 플래그는 알 수 없으므로 무시됩니다./home/torbjorr/deployed/vector/x86_64-GNU
2fLinux
이 문제를 해결할 수 있는 방법이 없습니다. Ash에 탈출 메커니즘이 있어서 특별히 취급되지 않더라도 %
다른 껍질이나 그와 유사한 것에서는 작동하지 않습니다.$PATH
execvp()
%
의 문자를 제거해야 하므로 $PATH
디렉터리 이름을 바꾸거나 심볼릭 링크를 추가하세요.
또는 이를 수행하지 않는 다른 경량 POSIX 쉘 구현에는 ash
사용 하지 마십시오 ./bin/sh
yash
그리고 mksh
.