나는 일부 쉘이 최소한 파일 이름이 심볼릭 링크를 명명하는 경우를 감지하기 위해 파일 테스트 연산자를 지원한다는 것을 알고 있습니다.
POSIX가 있나요?유용1 동일한 기능을 제공합니까?
1 여기서는 올바른 용어를 사용하지 않았을 수 있습니다. "유틸리티"란 내장 셸이 아닌 , /bin
etc. 아래에 있는 독립 실행형 실행 파일을 의미합니다 ./usr/bin
답변1
당신이 찾고있는test
:
-h 경로명
경로 이름이 존재하고 기호 링크인 파일로 확인되면 참입니다. 경로 이름을 확인할 수 없거나 경로 이름이 존재하지만 심볼릭 링크가 아닌 파일로 확인되면 False를 반환합니다. 경로 이름의 마지막 구성 요소가 기호 링크인 경우 기호 링크를 따르지 않습니다.
대부분의 쉘에는 내장 프로그램이 있지만 test
중간에 쉘을 호출하지 않고 다른 프로그램에서 호출할 수 있는 독립 실행형 프로그램으로도 존재합니다. 이는 쉘 자체에서 작동하는 기능( break
, export
, set
, ...과 같은 특수 내장 기능) 을 제외하고 쉘에 있을 수 있는 대부분의 내장 기능에 해당됩니다 .
[ -h pathname ]
Equivalent test -h pathname
는 [
정확히 동일하게 작동 test
하지만 [
끝에 추가 매개변수가 필요합니다. 에서와 같이 독립 실행형 프로그램으로 존재합니다.]
[
test
예를 들어:
$ ln -s foo bar
$ /usr/bin/test -h bar && echo y
y
답변2
두 가지 유틸리티가 이 작업을 수행할 수 file
있습니다 readlink
.
file some_symlink
표시됩니다some_symlink: symbolic link to 'some_target'
readlink some_symlink
코드 0으로 종료되고readlink some_file
코드 1로 종료됩니다.
알아채다종료 코드변수에 저장되어 $?
표시 가능합니다 echo $?
.
답변3
게다가 stat
:
$ touch test
$ ln -s test test_l
$ stat test
File: `test'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fc00h/64512d Inode: 4309 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ vagrant) Gid: ( 1000/ vagrant)
Access: 2015-09-11 11:37:59.864165922 +0000
Modify: 2015-09-11 11:37:59.864165922 +0000
Change: 2015-09-11 11:37:59.864165922 +0000
Birth: -
$ stat test_l
File: `test_l' -> `test'
Size: 4 Blocks: 0 IO Block: 4096 symbolic link
Device: fc00h/64512d Inode: 7179 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ vagrant) Gid: ( 1000/ vagrant)
Access: 2015-09-11 11:38:07.220173955 +0000
Modify: 2015-09-11 11:38:07.220173955 +0000
Change: 2015-09-11 11:38:07.220173955 +0000
Birth: -
$ stat -c "%F" test
regular empty file
$ stat -c "%F" test_l
symbolic link
답변4
또는 간단한 스크립트를 사용할 수 있습니다.
#!/bin/bash
ls -alFQ | grep '^l'
Unix의 핵심은 복잡한 작업을 수행하기 위해 서로 연결될 수 있는 작고 간단한 유틸리티를 갖는 것입니다. 따라서 이것은 기술적으로 POSIX 유틸리티는 아니지만 거의 POSIX 유틸리티에 가깝습니다.
더 멋지게 만들고 싶다면 반환할 문자열 부분만 선택할 수 있습니다.
#!/bin/bash
ls -alFQ | grep '^l' | tr -s ' ' | cut -d ' ' -f 11
-f 11
링크가 가리키는 파일을 반환 하고, -f 10
링크의 이름을 반환합니다. 이것은 파일 이름에 공백이 없는 경우에만 작동합니다. 그렇지 않으면 까다로워집니다. 아마도 완료할 수 있지만 공백을 벗어나거나 패턴을 사용해야 합니다. 이는 제가 지금 작성하고 싶은 것보다 더 많은 작업입니다. .
0/1을 반환하는 것을 원하는 경우:
#!/bin/bash
if [[ -n $(ls -alFQ | grep '^l') ]]; then
exit
else
exit 1
fi