'어느', 하지만 모두

'어느', 하지만 모두

아마 대부분의 사람들이 이 which명령에 익숙할 것이고, 나도 꽤 자주 사용하게 될 것이다. 방금 내 경로에서 어떤 명령이 첫 번째인지뿐만 아니라 얼마나 많은 명령이 있고 어디에 있는지 궁금해지는 상황에 직면했습니다.모두경로에 있는 모든 명령은 다음과 같습니다. 어떤 매뉴얼 페이지를 시도해 보았지만(이 말을 입력하면 man which웃게 됩니다) 아무 것도 볼 수 없었습니다.

답변1

일부 시스템에서는which -a모든 일치 항목을 표시합니다. 쉘이 bash 또는 zsh1인 경우 다음을 사용할 수 있습니다 type. type foo첫 번째 일치 항목 표시 및 type -a foo모든 일치 항목 표시. 이 세 가지 명령은 대부분 동일한 작업을 type수행합니다 . 셸과 운영 체제 간의 차이점은 가용성, 옵션 및 보고 내용입니다. 항상 사용 가능하며 가능한 모든 명령과 유사한 이름(별칭, 키워드, 쉘 내장, 함수 및 외부 명령)을 표시합니다.whichwhencetype

모든 일치 항목을 표시하는 완전히 이식 가능한 유일한 방법은 $PATH자신을 구문 분석하는 것입니다. 이를 수행하는 쉘 스크립트는 다음과 같습니다. 이것을 셸 함수로 만드는 경우 함수 본문을 괄호로 묶은 다음(으로 변경하면 함수가 이스케이프되지 않도록) IFS로 변경 합니다 .set -fexitreturn

#!/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 -azsh에서 원하는 것을 수행하십시오.

 7:27AM 7 % whence -a cat
/usr/bin/cat
/bin/cat
/usr/bin/cat
/bin/cat

zsh에서 PATH를 정리해야 하는데, 중복된 항목이 많이 있습니다. whence -aksh에서는 상황이 다르게 작동합니다.

$ whence -a cat
cat is a tracked alias for /usr/bin/cat

나는 이것이 잠재적으로 유용한 행동처럼 보인다고 말해야 합니다.

관련 정보