command -p mkdir
쉘 스크립트에서 사용하는데 문제가 있습니다 ksh93
.
이 command -p
비트는,POSIX에 따르면,
명령 검색은 기본값을 사용하여 수행되며
PATH
모든 표준 유틸리티를 찾을 수 있습니다.
설명서 ksh93
에도 비슷한 문구가 있습니다.
이
-p
옵션을 사용하면 값으로 정의된 경로가 아닌 기본 경로가 검색됩니다PATH
. 이름을 조회할 때 기능은 검색되지 않습니다. 또한 이름이 특수 내장 항목을 참조하는 경우 주요 단검과 관련된 특수 속성은 존중되지 않습니다. (예를 들어, 미리 정의된 별칭은redirect='command exec'
잘못된 리디렉션이 주어졌을 때 스크립트가 종료되는 것을 방지합니다.)
스크립트를 다음과 같이 단순화했습니다.
#!/usr/local/bin/ksh93 -x
echo "$PATH"
command -p mkdir t
실행하세요:
$ ./test.sh
+ echo /usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin
/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin
+ command -p mkdir t
./test.sh[3]: mkdir: not found [No such file or directory]
$PATH
ksh93
for (설명서에 따르면) 의 기본값은 /bin:/usr/bin:
이며 mkdir
다음에서 찾을 수 있습니다 /bin
.
$ command -v mkdir
/bin/mkdir
getconf PATH
를 호출하기 전에 스크립트에서 명령을 실행 하면 (기본 시스템 정의 값을 가져오기 위해 $PATH
) mkdir
,통화 mkdir
성공.
ksh93
이는 적어도 Ubuntu, OpenBSD, macOS 및 Solaris에서는 "version AJM 93u+ 2012-08-01"에서 볼 수 있으며 cat
적어도 동일한 방식으로 호출할 때도 영향을 미칩니다.
질문:여기서 분명한 것을 놓치고 있습니까?
추가 정보:
builtin
의 명령은 ksh93
(존재하지 않는) paths 아래에 여러 유틸리티를 나열합니다 /opt/ast/bin
. 이것이 이것과 관련이 있습니까?
$ builtin
:
.
[
/opt/ast/bin/basename
/opt/ast/bin/cat
/opt/ast/bin/chmod
/opt/ast/bin/cmp
/opt/ast/bin/cut
/opt/ast/bin/dirname
/opt/ast/bin/getconf
/opt/ast/bin/head
/opt/ast/bin/logname
/opt/ast/bin/mkdir
/opt/ast/bin/sync
/opt/ast/bin/uname
/opt/ast/bin/wc
alarm
alias
(등.)
ast-users
업데이트: 이 쿼리를 메일링 리스트에도 제출했습니다.
답변1
여기와 위에 표시된 내용에 따르면 ast-user
이는 버그처럼 보이지만 질문에 대한 답변은 아닙니다.
재건됨
이 질문은 별도의 질문으로 답변하는 것이 가장 좋지만 현재로서는 이것으로 충분합니다.
Ksh93에는 공유 라이브러리에서 추가 명령을 로드한 다음 기존(또는 존재하지 않는) 디렉터리에 바인딩하는 기능이 있습니다.$PATH
경로가 있는 명령이 /opt/ast/bin/
고려됩니다.경계도착하다 /opt/ast/bin
. 이는 $PATH에/opt/bin/ast/bin
앞으로 /bin
, ksh93은 cat
내장 함수를 먼저 호출합니다 /bin/cat
.
그 존재 /opt/ast/bin
여부는 /opt/ast/bin/cat
이 메커니즘에 영향을 미치지 않습니다.
답변2
command -p
ksh93의 AT&T 배포판에는 기본/표준 경로가 올바르게 초기화되지 않아 버그가 많은 것으로 알려져 있습니다. 이것은 수정된 수백 개의 버그 중 하나입니다.Keshi93u+m활발히 유지관리되고 개발되고 있습니다. (저는 메인 개발자/유지관리자입니다.) 최소한 Debian Unstable 및 Slackware-current에서는 기본 ksh93이지만, 물론 코드를 얻고 직접 컴파일할 수도 있습니다.