주어진 실행 파일의 디렉터리를 어떻게 반환하나요?

주어진 실행 파일의 디렉터리를 어떻게 반환하나요?

특정 실행 파일의 경로를 반환하려면 다음을 실행할 수 있습니다.

which mysql

예를 들어 다음을 반환합니다.

/usr/bin/mysql

나는 단지 돌아오고 싶다:

/usr/bin

어떻게 해야 하나요?

답변1

executable=mysql

executable_path=$(command -v -- "$executable") &&
  dirname -- "$executable_path"

(사용하지 마세요which).

$executable물론 쉘 내장, 함수 또는 별칭인 경우에는 작동하지 않습니다. mysql이 기능이 내장된 쉘이 있는지는 모르겠습니다 . 이전에 정의하지 않은 이상 함수나 별칭이 아니지만 이를 알고 있어야 합니다. bash내보낸 함수에 대한 지원은 예외일 수 있습니다 .

$ bash -c 'command -v mysql'
/usr/bin/mysql
$ mysql='() { echo test;}' bash -c 'command -v mysql'
mysql

답변2

어느

일반적으로 이 명령은 피해야 합니다.

왜?

빌드할 때 현재 환경을 사용하기 때문에 $PATH실행 파일을 찾을 때 평가됩니다. 이로 인해 $PATH실행 시 파일 빌드의 내용을 사용할 수 있는 쉘 스크립트 등을 처리할 때 혼란이 발생할 수 있습니다 .~/.bashrc~/.bash_profile

예를 들어:

# path to start
$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/sam/bin

# let's change it
$ export PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin

$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin

# simulate a new env. for a shell script
$ bash -lc "echo \$PATH"
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/sam/bin

쉘 스크립트가 실행되면 현재 환경이 아닌 원래 환경을 갖게 된다는 점에 유의하세요!

유형

다음 명령을 사용하여 type환경에서 실행 파일을 찾을 수도 있습니다.

$ type ls
ls is aliased to `ls --color=auto'

또는 모든 내용을 보려면 -a다음 스위치를 사용하세요.

$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls

type별칭과 위치가 표시됩니다. 그러나 디렉토리를 찾으려면 command@StephaneChazelas 솔루션을 사용하는 것이 좋습니다.

어디

명령을 사용할 수도 있지만 whereis검색할 디렉터리 집합이 하드코딩되어 있는 환경은 사용되지 않습니다. 보다남자들은 어디 있어?자세한 내용은.

위치

이는 사람들을 혼란스럽게 할 수 있지만 일부 배포판에는 일반적으로 하루에 한 번 cron 작업에서 실행되는 도구가 포함되어 있으며 전체 디스크를 스캔하고 locate해당 명령을 사용하여 검색할 수 있는 작은 데이터베이스 파일을 구축합니다.

  • /etc/cron.daily/mlocate.cronFedora 14 시스템에서 cron 작업이 호출됩니다.
  • 스캔을 수행하는 도구를 이라고 합니다 /usr/bin/updatedb.
  • DB 파일은 다음 위치에 있습니다 /var/lib/mlocate/mlocate.db.

제가 생각하기에 약간의 해킹이라고 생각되는 것을 사용하면 다음과 같은 이름의 파일 locate만 찾도록 속일 수 있습니다 .ls

$ locate -b '\ls'
/bin/ls
/usr/share/javadoc/java-1.6.0-openjdk/api/org/w3c/dom/ls
/usr/share/javadoc/java-1.6.0-openjdk/jre/api/plugin/dom/org/w3c/dom/ls
/usr/share/locale/l10n/ls
/var/cache/abrt-di/usr/src/debug/gcc-4.5.1-20100924/libjava/classpath/external/w3c_dom/org/w3c/dom/ls
/var/cache/abrt-di/usr/src/debug/gcc-4.5.1-20100924/libjava/classpath/gnu/xml/dom/ls

위 방법은 \와일드카드를 사용하기 때문에 작동하므로 암시적 ls대체가 비활성화됩니다 *ls*.

보다맨 페이지 찾기자세한 내용은.

무엇인가요

잘 알려지지 않은 도구는 입니다 whatis. 이것은 locate.so와 유사하므로 데이터베이스에 의해 지원됩니다. 그러나 명령을 찾는 데는 유용합니다.

$ whatis ls
ls                   (1)  - list directory contents
ls                   (1p)  - list directory contents

이 도구는 cron 작업에서 호출됩니다 /etc/cron.daily/makewhatis.cron. 그러나 해당 데이터베이스는 시스템의 페이지를 기반으로 makewhatis구축됩니다 .man

이에 대한 자세한 내용은 다음에서 확인할 수 있습니다.makewhatis 매뉴얼 페이지.

디렉토리 이름만?

dirpath위에서 언급한 명령으로 생성된 출력에 대해 이 명령을 사용하여 디렉터리 구성 요소만 가져올 수 있습니다.

dirpath검사가 수행되지 않으므로 모든 종류의 파일 경로를 제공할 수 있으며 디렉터리 부분이 제공됩니다.

$ dirname /some/path/to/a/script
/some/path/to/a

답변3

xargs를 사용하는 것은 매우 간단합니다.

which mysql | xargs dirname

답변4

~처럼다른 사람가지다설명했다,사용하지 마세요which.

이 변수를 반복하는 작은 쉘 함수를 작성할 수 있습니다 PATH.

which-directory () (
  IFS=:
  set -g
  for d in $PATH; do
    if [ -z "$d" ]; then d=.; fi
    if [ -x "$d/$1" ]; then printf '%s\n' "$d"; return; fi
  done
  return 1
)

또는 을 호출하여 command -v별칭과 기능은 물론 외부 명령도 보고할 수 있습니다. mysql추가 인수를 사용하여 동일한 이름의 외부 명령을 호출하는 별칭이나 함수가 있는 경우 command -v정의된 함수나 별칭이 없는 새로 시작된 셸에서 이를 호출할 수 있습니다. 이는 별칭이나 함수가 동일한 이름을 가진 외부 명령을 호출하는 경우에만 해당됩니다. 다음 두 개의 단일 라이너는 동일합니다(PATH에 개행 문자가 포함된 디렉터리 또는 실행 파일 이름이 없다고 가정).

dirname -- "$(sh -c 'command -v "$0"' -- mysql)"
sh -c 'command -v "$0"' -- mysql | sed -e 's!.*/!!'

zsh에서 다음 코드 줄은 동일한 작업을 수행합니다.

echo =mysql(:h)

관련 정보