readlink
누군가 다음 명령 옵션을 간단한 언어로 설명해 줄 수 있습니까?
-f, --canonicalize
canonicalize by following every symlink in every component of
the given name recursively; all but the last component must
exist
-e, --canonicalize-existing
canonicalize by following every symlink in every component of
the given name recursively, all components must exist
-m, --canonicalize-missing
canonicalize by following every symlink in every component of
the given name recursively, without requirements on components
existence
답변1
이건 설명이 필요 없을 것 같아서 모호하게 들리는 부분은 잘 모르겠습니다... 예를 들어보겠습니다.
--표준화
$ mkdir /tmp/realdir
$ mkdir /tmp/subdir
$ ln -s /tmp/realdir /tmp/subdir/link
$ cd /tmp
$ readlink -f ./subdir/link/nonexistentdir/
/tmp/realdir/nonexistentdir
$ readlink -f ./subdir/link/nonexistentfile.txt
/tmp/realdir/nonexistentfile.txt
옵션이 무엇이든 다음을 readlink
수행합니다. - 상대 경로를 절대 경로로 변환 - 심볼릭 링크 이름을 실제 경로로 변환
위에서 볼 수 있듯이 를 사용하면 -f
경로 readlink
의 마지막 부분(여기 nonexistentfile.txt
)이 존재하는지 여부는 상관하지 않습니다.
경로의 다른 부분이 존재하지 않으면 readlink
아무 것도 출력되지 않으며 반환 코드는 0(오류가 발생했음을 의미)과 다릅니다. 바라보다:
$ readlink -f /tmp/fakedir/foo.txt
$ echo $?
1
--기존 표준화
같은 것을 시도하면 -e
:
$ readlink -e ./subdir/link
/tmp/realdir
$ readlink -e ./subdir/link/nonexistentfile.txt
$ echo $?
1
사용 시 -e
경로 구성 요소가 없으면 readlink
아무것도 출력되지 않으며 반환 코드는 0과 다릅니다.
--표준화 부족
-m
옵션은 반대입니다 -e
. 경로의 구성요소가 존재하는지 확인하기 위한 테스트는 수행되지 않습니다.
$ readlink -m ./subdir/link/fakedir/fakefile
/tmp/realdir/fakedir/fakefile
$ ln -s /nonexistent /tmp/subdir/brokenlink
$ readlink -m ./subdir/brokenlink/foobar
/nonexistent/foobar
답변2
나를 혼란스럽게 하는 것은 왜 누군가에게 -e 및 -m 옵션이 필요합니까?
커널 소스 코드 ./scripts/kconfig/merge_config.sh에서(이 스크립트는 구성 조각 값 목록을 가져와 하나씩 병합합니다):
if [ -z "$KCONFIG_CONFIG" ]; then
if [ "$OUTPUT" != . ]; then
KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config")
else
KCONFIG_CONFIG=.config
fi
fi
KCONFIG_CONFIG는 아직 존재하지 않을 수 있는 .config 파일에 대한 경로를 받습니다.