file 명령을 사용하여 최종 실행 파일 경로를 찾는 방법은 무엇입니까?

file 명령을 사용하여 최종 실행 파일 경로를 찾는 방법은 무엇입니까?

저는 Ubuntu 20.04를 사용하고 있으며 일반적으로 주어진 명령의 최종 실행 가능 경로를 찾아야 합니다. awk예를 들어 보겠습니다 .

file $(which awk)
# Output: /usr/bin/awk: symbolic link to /etc/alternatives/awk

file /etc/alternatives/awk
# Output: /etc/alternatives/awk: symbolic link to /usr/bin/gawk

내 질문은 다음과 같습니다

file주어진 명령의 최종 경로를 직접 반환하는 명령(또는 명령에 대한 플래그)이 있습니까 ? 위의 예에서는 경로를 반환하고 싶습니다.gawk

감사해요

답변1

당신은 그것을 사용할 수 있습니다 readlink:

$ readlink -f -- "$(which awk)"
/usr/bin/gawk

에서 man readlink:

-f, --정규화 지정된 이름을 가진 모든 구성 요소의 모든 심볼릭 링크를 반복적으로 추적하여 정규화합니다. 마지막 구성 요소를 제외한 모든 구성 요소가 존재해야 합니다.

답변2

다른 명령을 찾았습니다 realpath.

realpath -- "$(which awk)"
#Output: /usr/bin/gawk

답변3

Linux에서 명령에 대한 정보를 file반환하고 그렇게 할 때 모든 기호 링크를 확인하도록 명령 하려면 다음 옵션과 함께 사용하세요 .awkfile-L

$ file -L -- "$(command -v awk)"
/bin/awk: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=b863ebf57d3cc33d8e7fed3be0e0b5d235489b46, for GNU/Linux 3.2.0, stripped

모든 링크를 확인하여 명령에 대한 최종 절대 경로를 얻으려면 다음을 사용하십시오 readlink -e.

$ readlink -e -- "$(command -v awk)"
/usr/bin/gawk

답변4

에서 zsh변수에 명령 이름이 있는 경우 $cmd명령 $cmd:c경로로 확장되며( $PATH/ 를 검색하여 $path) :P한정자를 사용하여 해당하는 경로를 얻을 수 있습니다.실제 경로(표준 C 함수를 사용하는 경우 파일에 대한 비기호적 링크 지정 절대 경로는 입니다 realpath().)

$ cmd=awk
$ print -r -- $cmd:c
/usr/bin/awk
$ print -r -- $cmd:c:P
/usr/bin/gawk
$ file -- $cmd:c:P
/usr/bin/gawk: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=b863ebf57d3cc33d8e7fed3be0e0b5d235489b46, for GNU/Linux 3.2.0, stripped
$ namei -l -- $cmd:c
f: /usr/bin/awk
drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxr-xr-x root root bin
lrwxrwxrwx root root awk -> /etc/alternatives/awk
drwxr-xr-x root root   /
drwxr-xr-x root root   etc
drwxr-xr-x root root   alternatives
lrwxrwxrwx root root   awk -> /usr/bin/gawk
drwxr-xr-x root root     /
drwxr-xr-x root root     usr
drwxr-xr-x root root     bin
-rwxr-xr-x root root     gawk

중간 변수를 피하기 위해 익명 함수를 사용할 수 있습니다.

$ (){print -r -- $1:c:P} awk
/usr/bin/gawk

또는 일반 기능:

$ canonical-path-of() print -rC1 -- $@:c:P
$ canonical-path-of awk ls
/usr/bin/gawk
/usr/bin/ls

=cmd다음 형식의 연산자를 사용할 수도 있습니다.파일 이름 확장자좋다물결표 확장하지만 해당 명령의 경로로 확장되며 :P이때에도 수식어는 다음과 같이 적용됩니다.글로벌 예선²:

$ print -r -- =awk
/usr/bin/awk
$ print -r -- =awk(:P)
/usr/bin/gawk
$ print -r -- =blah
zsh: blah not found

그러나 명령이 에서 발견되지 않으면 와 $PATH동일한 $cmd:c내용으로 확장되고 $cmd현재 작업 디렉토리를 기준으로 하는 경로로 확장됩니다 $cmd:c:P.$cmd

² 이번에는 명령을 찾을 수 없으면 치명적인 오류가 발생합니다. =cmd확장 프로그램은 다음을 통해 비활성화할 수 있습니다.set +o equals

관련 정보