저는 Newbam의 "Learning the Bash Shell" 책을 통해 bash 스크립팅을 독학하고 있습니다. 저는 책 작업을 잘 진행하고 있지만 아래 스크립트에 대해 약간 혼란스럽습니다. 이는 for 루프를 사용하여 디렉터리를 반복하고 $PATH
해당 디렉터리에 대한 정보를 인쇄하는 스크립트입니다. 스크립트는
IFS=:
for dir in $PATH; do
if [ -z "$dir" ]; then dir=.; fi
if ! [ -e "$dir" ]; then
echo "$dir doesn't exist"
elif ! [ -d "$dir" ]; then
echo "$dir isn't a directory"
else
ls -ld $dir
done
내가 혼란스러워하는 점은 dir이 0이거나 존재하지 않는 경우 이 null 값을 현재 디렉터리로 설정해야 하는 이유입니다. 아니면 dir을 현재 디렉터리(우리가 있는 디렉터리)로 변경합니까? 그런 다음 스크립트는 dir이 존재하는지, 그리고 그것이 디렉토리인지 테스트하는 것으로 나타납니다.
스크립트의 이러한 측면을 설명하는 데 도움을 줄 수 있는 사람이 있습니까? [ -z "$dir" ]
이것이 사실이라면 디렉토리가 존재하지 않으며 디렉토리가 아니라는 것을 나타낼 것이라고 생각했을 것입니다 .
답변1
테스트 에서는 실제 디렉터리와 관련된 내용이 아닌 -z
길이가 0인 값을 테스트합니다 . 이 조건은 $dir
변수에 시퀀스가 있는 경우 트리거되며 , 이 시점에서 현재 디렉터리를 나타내도록 변수 값을 설정한 다음 이에 대한 표준 두 가지 테스트를 수행합니다.::
PATH
$dir
.
답변2
$dir이 비어 있으면(-z 테스트) $dir이 로 설정됩니다. (시작 스크립트의 현재 디렉터리)
이제 $PATH가 PATH=/bin::/usr/bin:/usr/local/bin과 같이 형식이 잘못되었다고 추측합니다. 두 번째 수준에는 빈 필드가 있습니다. 따라서 필드가 비어 있으면 시작 스크립트의 현재 디렉터리(이후 dir=.)로 대체됩니다.
답변3
어쩌면 elif(else if)가 누락되었을 수도 있습니다.
그러나 이 스크립트는 $dir 내용을 나열하기 위한 것이지만 먼저 확인하십시오.
$dir
존재하다if ! [ -e "$dir" ]
$dir
파일, 파이프 또는 개발자가 아닌 디렉터리입니다.elif ! [ -d "$dir" ]
$dir에 null 값을 사용하여 이러한 테스트를 실행할 수 없으므로 첫 번째 줄( if [ -z "$dir" ]; then dir=.; fi
)을 사용하여 빈 문자열을 로 바꿉니다. 이것은 디렉토리이며 존재합니다.
빈 $dir 문자열은 두 가지 방법으로 사용될 수 있습니다.
PATH=/usr/bin:/sbin::$HOME/bin
PATH=/usr/bin:/sbin:$MYAPPBINDIR:$HOME/bin
($MYAPPBINDIR
비어 있는 곳).
답변4
~에서POSIX 사양PATH
(스크롤을 조금 아래로 내려야 합니다):
(강조는 내 것)
길
이 변수는 파일 이름으로만 알려진 실행 파일을 검색할 때 특정 기능 및 유틸리티가 적용하는 일련의 경로 접두사를 나타내야 합니다. 접두사는 ( ':' )로 구분해야 합니다. 이 파일 이름에 길이가 0이 아닌 접두사가 적용될 때 접두사가 .로 끝나지 않으면 접두사와 파일 이름 사이에 a를 삽입해야 합니다.길이가 0인 접두사는 현재 작업 디렉터리를 나타내는 오래된 기능입니다. 두 개의 인접한 문자( "::" ), 목록의 나머지 부분 앞의 첫 번째 문자 또는 목록의 나머지 부분 뒤의 후행 문자로 나타납니다.엄격하게 호환되는 응용 프로그램은 실제 경로 이름(예: .)을 사용하여 PATH의 현재 작업 디렉터리를 나타내야 합니다. 지정된 이름과 적절한 실행 권한을 가진 실행 파일을 찾을 때까지 각 접두사에 파일 이름을 적용하여 목록을 처음부터 끝까지 검색해야 합니다. 찾고 있는 경로 이름에 다음이 포함된 경우 경로 접두어로 검색하면 안 됩니다. 경로 이름이 로 시작하면 지정된 경로가 확인됩니다(경로 이름 확인 참조). PATH가 설정되지 않거나 null로 설정된 경우 경로 검색은 구현에 따라 정의됩니다. PATH에서 사용할 수 있는 디렉터리 이름은 이 컨텍스트에서 구분 기호이므로 문자를 포함할 수 없습니다.
내 가정은 POSIX 사양이 .
현재 작업 디렉터리 이름으로 특별한 이름을 사용하지 않거나 가지고 있지 않은 시스템을 수용하기 위해 빈 문자열을 허용한다는 것입니다.