아마 대부분의 사람들이 이 which
명령에 익숙할 것이고, 나도 꽤 자주 사용하게 될 것이다. 방금 내 경로에서 어떤 명령이 첫 번째인지뿐만 아니라 얼마나 많은 명령이 있고 어디에 있는지 궁금해지는 상황에 직면했습니다.모두경로에 있는 모든 명령은 다음과 같습니다. 어떤 매뉴얼 페이지를 시도해 보았지만(이 말을 입력하면 man which
웃게 됩니다) 아무 것도 볼 수 없었습니다.
답변1
일부 시스템에서는which -a
모든 일치 항목을 표시합니다. 쉘이 bash 또는 zsh1인 경우 다음을 사용할 수 있습니다 type
. type foo
첫 번째 일치 항목 표시 및 type -a foo
모든 일치 항목 표시. 이 세 가지 명령은 대부분 동일한 작업을 type
수행합니다 . 셸과 운영 체제 간의 차이점은 가용성, 옵션 및 보고 내용입니다. 항상 사용 가능하며 가능한 모든 명령과 유사한 이름(별칭, 키워드, 쉘 내장, 함수 및 외부 명령)을 표시합니다.which
whence
type
모든 일치 항목을 표시하는 완전히 이식 가능한 유일한 방법은 $PATH
자신을 구문 분석하는 것입니다. 이를 수행하는 쉘 스크립트는 다음과 같습니다. 이것을 셸 함수로 만드는 경우 함수 본문을 괄호로 묶은 다음(으로 변경하면 함수가 이스케이프되지 않도록) IFS
로 변경 합니다 .set -f
exit
return
#!/bin/sh
set -f # disable globbing
IFS=: # break words at : only
not_found=1
for d in $PATH; do
if [ -f "$d/$x" ] && [ -x "$d/$x" ]; then
printf '%s\n' "$d/$x"
not_found=0
fi
done
exit $not_found
또는 문서에 따르면 ksh 93이지만 ksh 93s+ 2008-01-31은 시도할 때만 첫 번째 일치 항목을 인쇄합니다 .
답변2
--all 또는 -a 플래그는 경로의 모든 일치 항목과 별칭을 표시합니다(적어도 Fedora, Ubuntu 및 CentOS에서는).
which -a which
AIX 및 Solaris에서는 다음과 같은 이점을 얻을 수 있습니다.
echo "$PATH" | sed -e 's/:/ /g' | \
while read -r p; do find "$p" -type f -name "which"; done
답변3
which
지원이 없거나 사용 가능한 경우 -a
직접 whence
출시하세요.
#!/bin/sh -f
IFS=":"
for PART in $PATH
do
if test -x "$PART/$1"
then
echo $PART/$1
fi
done
답변4
ksh와 zsh에는 "whence"가 셸로 내장되어 있습니다. whence -a
zsh에서 원하는 것을 수행하십시오.
7:27AM 7 % whence -a cat
/usr/bin/cat
/bin/cat
/usr/bin/cat
/bin/cat
zsh에서 PATH를 정리해야 하는데, 중복된 항목이 많이 있습니다. whence -a
ksh에서는 상황이 다르게 작동합니다.
$ whence -a cat
cat is a tracked alias for /usr/bin/cat
나는 이것이 잠재적으로 유용한 행동처럼 보인다고 말해야 합니다.