유효한 $PATH 디렉토리를 확인하고 출력하여 각 디렉토리가 유효한지 어떻게 확인합니까?

유효한 $PATH 디렉토리를 확인하고 출력하여 각 디렉토리가 유효한지 어떻게 확인합니까?

알겠습니다. 다음 정보를 얻었습니다.

check="${PATH//:/'\n'}"

위의 내용은 각 경로를 단순화된 방식으로 취하고 이를 변수로 멋지게 형식화합니다. 이제 각 행이 존재하는지 확인하고 echo와 결합하여 각 행을 선언하는지 어떻게 확인합니까(echo를 사용할 것 같습니다.)?

아마도 for 또는 while 루프가 관련되어 있다는 것을 알고 있지만 어떻게 해야 할지 모르겠습니다.

세게 때리다대답만 해주세요.

답변1

while read -d: dir
do
    [ -d "$dir" ] || echo "Missing: $dir"
done <<<"${PATH%:}:"

read -d: dir입력을 변수로 읽어 dir해당 시점의 입력을 삭제합니다 :.

[ -d "$dir" ]디렉토리가 존재하는지 테스트

||다음 문은 이전 문이 false를 반환하는 경우에만 실행됩니다.

<<<"${PATH%:}:"다음을 사용하여 루프에 입력을 제공합니다.여기에 있는 문자열. 이 형식을 "${PATH%:}:"사용하면 :PATH 문자열을 따르게 됩니다. 이 작업은 두 단계로 수행됩니다. 처음 사용접미사 제거, , 는 ${PATH%:}PATH 에서 후행( :있는 경우) 을 제거합니다. 둘째, 콜론을 추가합니다.

답변2

이는 이 기사가 게시된 당시 존재했던 세 가지 답변 1 중 가장 좋은 부분을 결합하고 (해당 답변을 보려면 답변을 "가장 오래된"순으로 정렬) 약간 다른 접근 방식을 추가합니다.John1024는 무엇을 하고 있나요?:

IFS=: read -a path_components <<< "$PATH"
for dir in "${path_components[@]}"
do
    printf "%s\t-> " "$dir"
    if [ -d "$dir" ]
    then
        echo "Exists."
    else
        echo "Missing!!!!"
    fi
done

IFS=:본질적으로 John 과 동일한 작업을 수행합니다. (공백이나 탭이 아닌) read -d:입력을 중단하므로 :John의 답변과 마찬가지로 이름에 공백이 있는 디렉토리를 올바르게 처리합니다.  read -a path_components입력 내용 읽기배열; "${path_components[@]"배열 구성원 목록으로 확장됩니다. echo "$dir"만약 $dir에 참고하세요-또는 .을 포함합니다 \. (물론 .의 디렉터리 이름에는 이러한 이름이 없습니다. $PATH) . printf "$dir"가 포함되어 있으면 위험할 수 있습니다. ________ 1 이 답변을 쓰는 ​​동안 그 중 하나가 제거되었습니다.$dir%

답변3

다음 방법을 시도해 볼 수도 있습니다.

#!/bin/bash

arr=$(echo $PATH | tr ":" "\n")

for x in $arr
do
    echo -n "$x"
     if [ -d "$x" ];then
        echo " -> Exists"
     else
         echo -e " -> \e[31mMissing!!!!\e[0m"
     fi
done

arr=$(echo $PATH | tr ":" "\n")디렉토리를 변수로 분할 하고 echo -e디스플레이에 빨간색을 추가하여 주의를 환기시킵니다.

출력은 다음과 같습니다.

/usr/lib/qt-3.3/bin -> 존재함

/usr/local/sbin -> 존재함

/usr/local/bin -> 존재함

/sbin->존재합니다

/bin -> 존재함

/usr/sbin -> 존재함

/usr/bin -> 존재함

/root/bin -> 분실! ! !

관련 정보