`어떤`이지만 모두


19

나는 대부분이 which명령에 익숙하다고 생각 하며 자주 사용합니다. 나는 얼마나 많은 어디서 명령 내 경로에 처음있는 그냥 궁금하지 않아요 상황에 달려 있지만, 모든 내 모든 경로의 명령이다. 나는 어떤 매뉴얼 페이지를 입력 해 보았지만 (타이핑 man which은 웃었다) 아무것도 보지 못했다.


1
내 시스템에서는 맨 페이지에 나열된 첫 번째 항목입니다 which --all.
Shawn J. Goff

2
내 (리눅스)에만 which -a있습니다.
사용자가 알 수 없음

답변:


23

일부 시스템 which -a에서는 모든 일치 항목을 표시합니다. 쉘이 bash 또는 zsh¹ 인 경우 type대신 사용할 수 있습니다 . type foo첫 번째 일치를 type -a foo표시하고 모든 일치를 표시합니다. 세 가지 명령 type, which그리고 whence대부분 같은 일을; 가용성, 옵션 및보고 내용에 따라 셸과 운영 체제가 다릅니다. type항상 사용 가능하며 가능한 모든 명령과 유사한 이름 (별칭, 키워드, 셸 내장, 기능 및 외부 명령)을 표시합니다.

모든 경기를 표시 할 수있는 완전 휴대용 방법은 $PATH자신 을 파싱하는 것입니다. 이 작업을 수행하는 쉘 스크립트가 있습니다. 당신이 그것을 쉘 기능을 한 경우, (의 변경 그래서 괄호 안에 함수 본문을 둘러싸 있는지 확인 IFS하고 set -f, 변경 기능을 탈출하지 않음) exitreturn.

#!/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은 시도 할 때 첫 번째 일치 항목 만 인쇄합니다.


sh에 빈 구성 요소가 있으면 해당 코드가 제대로 작동하지 않습니다 $PATH. 또한 POSIX 셸에서 $IFS필드 구분 기호 인 반면 $PATH콜론은 필드 구분 기호 로 사용됩니다 . which올바른 구현 방법은 데비안에있는 스크립트를 참조하십시오 .
Stéphane Chazelas

type의 내장은 ksh93u+ 2012-08-01제대로 작동하는 것 같다.
Stéphane Chazelas

5

--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

매개 변수 대체에 큰 따옴표가 필요합니다. 그렇지 않으면 $PATH공백이나 셸 글러브 문자가 포함되어 있으면 스크립트가 작동하지 않습니다 . read -r백 슬래시에 대처하는 데 필요합니다. find디렉토리에 $PATH하위 디렉토리가 포함되어 있으면 시간이 오래 걸리고 허위 일치 항목을 반환 할 수 있으므로이 방법은 좋지 않습니다 . 다행히도 find여기서는 유용하지 않습니다. 내 대답을 참조하십시오.
Gilles 'SO- 악한 중지'

중첩 디렉토리에서는 확실히 느리기 때문에 찾기가 잘못되었다는 것을 알았습니다. $ PATH에 글 로빙과 공백이 있습니까? eww. 그러나 당신은 옳습니다 (그렇게 말하지 않을 정도로 좋았지 만). 내 라이너 하나가 제대로 작성되지 않았습니다.
Eli Heady

1

which지원 -a이 없거나 whence사용할 수 없는 경우 직접 롤백하십시오.

#!/bin/sh -f

IFS=":"
for PART in $PATH
do
  if test -x "$PART/$1"
  then
    echo $PART/$1
  fi
done

set -f보호되지 않은에 대한 글러브 기능을 해제 할 수 없습니다 $PATH. test -f여기서는 실행 파일 만 원하므로 충분하지 않습니다. 당신은 필요합니다 test -x. 흠, 나는 내 스크립트에서 정기적 인 파일 테스트를 잊었다는 것을 알고있다.
Gilles 'SO- 악의를 멈춰라'

@Gilles : 팁에 따라 편집되었습니다. 나는 정확성을 위해 모두 있지만, whence README.txt가능성이 적습니다 whence "file* wi?h we!rd name". 순회하는 것이 얼마나 쉬운 지 보여 주려고 노력하는 것뿐입니다 $PATH.
MattBianco

0

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.