$ PATH 환경 변수 백분율


16

내 $ 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 쉘 호환성 모드에서는 지팡이를 찾을 수 없습니다.

$ wand
sh: 2: wand: not found

문제는이 경로의 % 기호 인 것 같습니다. 이 기호는 URL 인코딩으로 추가되었으므로 유효한 파일 이름이 아니더라도 "GNU / Linux"라는 이름을 디렉토리 이름에 사용할 수 있습니다. sh에서 작동하는 이름을 얻거나 sh 명령을 bash로 작동시킬 수 있습니까? 즉, bash가 / bin / sh 명령을 사용하여 호출 되었더라도 bash가 동일하게 동작하도록합니다.


좋은 질문. 그것은 '%'문자에서 $ PATH에서 제대로 작동하지 않는 것 같다 sh(이 글은 괜찮 bash하고 zsh있지만). 실행 파일을 직접 호출하면 sh; 정말 이상합니다.
Rmano

2 %%를 사용하면 어떻게됩니까?
mikeserv

아니면 %를 탈출?
mdpc

답변:


15

그것은 Bourne 쉘이 아니거나 Bourne 쉘을 bash모방하는 것이 아닙니다. 이것은 Almquist 쉘입니다.이 경우 Debian Almquist 쉘 (Debian of BSD의 Linux 포크 자체는 원래 Almquist 쉘을 기반으로합니다)입니다.

Almquist 셸 (원본 및 최신 버전) %에서 PATH에 추가 기능 이 사용 됩니다 ash. 문서에서 인용 :

경로 검색

명령을 찾을 때, 쉘은 먼저 해당 이름의 쉘 기능이 있는지 확인합니다. 그런 다음 PATH에에 대한 항목이 없으면 %builtin해당 이름으로 내장 명령을 찾습니다. 마지막으로 PATH의 각 항목을 차례로 검색하여 명령을 찾습니다.

PATH 변수의 값은 콜론으로 구분 된 일련의 항목이어야합니다. 각 항목은 디렉토리 이름 또는 디렉토리 이름과 백분율 기호로 시작하는 플래그로 구성됩니다. 현재 디렉토리는 빈 디렉토리 이름으로 표시해야합니다. 퍼센트 부호가 없으면 항목은 쉘이 지정된 디렉토리에서 명령을 검색하게합니다. 플래그 인 경우 %builtin 쉘 내장 명령 목록이 검색됩니다. 플래그 인 경우 %func 디렉토리에서 쉘에 대한 입력으로 읽은 파일을 검색합니다. 이 파일은 이름이 검색중인 명령의 이름 인 함수를 정의해야합니다.

슬래시가 포함 된 명령 이름은 위의 검색을 수행하지 않고 간단히 실행됩니다.

다른 조개 좋아 ksh하거나 zsh기능 메커니즘의 유사한 자동 로딩을 가지고 있지만 다른 변수를 (사용 $FPATH),하지만 당신은 우선 기능이나 실행 파일을 정의 할 수 없다.

귀하의 경우 에는 플래그가 /home/torbjorr/deployed/vector/x86_64-GNU%2fLinux있는 /home/torbjorr/deployed/vector/x86_64-GNU디렉토리로 해석됩니다 2fLinux. 해당 플래그는 알 수 없으므로 무시됩니다.

그 주위에 방법이 없습니다. 화산재이 너무 탈출 메커니즘을했다하더라도 %그것을 찾아 다른 쉘이나 다른 것들에없는 일 후, 특별히 것이다 처리 할 수 없습니다 $PATH처럼 execvp().

에서 %문자 를 제거해야 $PATH하므로 디렉토리 이름을 바꾸거나 심볼릭 링크를 추가하십시오.

또는 사용하지 않는 ash당신을 위해 /bin/sh. 이를 수행하지 않는 다른 경량 POSIX 셸 구현에는 yashand 가 포함됩니다 mksh.


이 답변은 설명을 제공하지만 해결책을 제시하지는 않습니다. %를 유지하는 호환 가능한 방법이 있습니까?
user877329

@ user877329, 여기에는 실제 해결책이 없습니다. 내 편집을 참조하십시오.
Stéphane Chazelas

3
즉, 데비안 sh은 POSIX 표준을 위반합니다. 별도의 sh점이 정확히 호환되지 않는 쉘 확장을 넘어서는 안된다는 점을 감안할 때 (요즘 아무도 /bin/sh로그인 쉘로 사용하지 않는 것 같습니다 ) 버그라고 생각합니다.
celtschk

1
@celtschk ash는 / bin / sh에 대한 사용 지점이 사용 의 성능 저하를 피하는 데 더 bash많으므로 yashor를 사용하는 것 mksh(또는 posh모든 확장을 제외하려는 경우)을 사용하는 것보다 여전히 낫습니다 bash. 또한 코너 케이스라고 생각할 수도 있습니다. 일반적으로 아무도 %경로 구성 요소를 가지고 있지 않습니다 . 대부분의 쉘에는 POSIX 호환이 아닌 코너 케이스가 있습니다.
Stéphane Chazelas

1
@mtmiller, 그것이 휴대용 파일 이름 문자 세트 (PFCS) 의 의미를 읽는 방법이 아닙니다 . POSIX는 프로그래밍 API를 지정하지만 파일 시스템 구현은 지정하지 않습니다. PFCS는 POSIX가 보장하는 최소한의 POSIX 보장은 현재 로케일에 관계없이 파일 시스템에 관계없이 작동하지만 파일 시스템에서 지원하고 현재 로케일에서 유효한 파일 이름의 문자를 허용하지 않는 도구에 대한 변명은 아닙니다. 예를 들어 POSIX에는 [해당 문자가 PFCS에 없더라도 명령 이 필요합니다 .
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.