저는 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
반환하고 그렇게 할 때 모든 기호 링크를 확인하도록 명령 하려면 다음 옵션과 함께 사용하세요 .awk
file
-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