저는 쉘에 비교적 새로운 사람입니다(지금은 기본만 알고 있습니다). 버그를 수정하기 위해 스크립트를 이해하려고 노력하고 있지만 Google을 통해 답변을 찾을 수 없는 것을 우연히 발견했습니다(아마도 올바른 것을 검색하지 않고도).
if [ -r "$1" ] ;
나는 제어 흐름에 대해 매우 잘 알고 있으며 이것이 $1
스크립트에 전달되는 매개 변수라는 것도 알고 있습니다. 우리가 평가하고 있는 실제 표현식이 무엇인지 모르겠습니다.-r
어떤 도움이라도 대단히 감사하겠습니다!
답변1
연산자와 첫 번째 위치 인수(또는 위치 인수가 설정되지 않은 경우 빈 문자열)의 내용을 연산자의 피연산자(및 대칭의 클로저 ) 로 [
사용하여 명령을 실행 합니다 .-r
-r
]
이 [
명령은 Bourne과 유사한 모든 쉘(및 fish
)에 내장되어 있습니다. 따라서 해당 문서는 일반적으로 해당 쉘 매뉴얼에서 찾을 수 있습니다. 로도 알려져 있습니다 test
.
쉘에 따라 다음을 시도해 보십시오.
info zsh test
info bash '['
fish -c 'help test'
- 또는
man ksh
/...man dash
정보 페이지가 없는 쉘의 경우.
(일부 시스템에서는 이러한 쉘에서 문서 형식을 사용할 수 있도록 하려면 bash-doc
또는 패키지를 설치해야 합니다 .)zsh-doc
info
또한 시스템에는 독립 실행형 명령 [
이나 test
다른 유형의 셸이나 셸이 아닌 것에서 사용할 수 있는 유사한 인터페이스가 있는 명령이 있는 경우가 많으며 명령을 실행하기 위해 셸을 사용하지 않습니다(예 env
: find -exec
...). 문서는 info test
또는 man test
( man '['
아마도)에서 찾을 수 있습니다.
특히 -r
운영자는 명령을 실행하는 프로세스 [
(내장 셸 [
)에 지정된 파일을 열 수 있는 권한이 있는지 테스트합니다.읽다. true인 경우 [
명령은 다음을 반환합니다.성공if
명령문의 이 부분이 실행되는 경우의 종료 상태입니다 then
.
access(argv[1], R_OK)
이는 C의 상황 과 동일합니다 .
답변2
질문 -r
: 사용자에게 $1
피연산자로 식별된 파일에 대한 읽기 권한이 있습니까?
test
이 유틸리티에 대한 POSIX 사양모든 표준 연산자를 포함하는 목록입니다.
그 중 일부는 다음과 같습니다:
-e file exists
-f file is a regular file (not a directory or device file)
-s file is not zero size
-d file is a directory
-b file is a block device
-c file is a character device
-p file is a pipe
-L file is a symbolic link
-S file is a socket
-t file (descriptor) is associated with a terminal device
-r file has read permission (for the user running the test)
-w file has write permission (for the user running the test)
-x file has execute permission (for the user running the test)