Como verificar os diretórios válidos do $ PATH e enviá-los informando se cada um é válido ou não?

1

Ok, então eu tenho isso:

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

O acima me guia cada caminho de maneira simplificada e formata-o bem em uma variável. Agora, como verifico cada linha de existência e declaro que para cada linha em combinação com um eco (acho que usaria echo)?

Eu sei que provavelmente envolve um loop for ou while, mas não sei como fazer isso.

BASH apenas responde por favor.

    
por David Prentice 18.11.2015 / 06:11

3 respostas

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

read -d: dir lê a entrada na variável dir , quebrando a entrada em : .

[ -d "$dir" ] testa a existência do diretório

|| apenas executa a declaração a seguir se a declaração anterior retornar falso.

<<<"${PATH%:}:" fornece entrada para o loop usando uma string aqui . O formulário "${PATH%:}:" garante que um : siga a sequência PATH. Isso é feito em duas etapas. O primeiro usa a remoção do sufixo , ${PATH%:} , para remover um : do PATH se houver um. Em segundo lugar, um cólon é adicionado.

    
por 18.11.2015 / 06:36
1

Isto combina as melhores partes das três respostas 1 existente no momento desta postagem (classifique as respostas por “mais antigas” se você quiser ver quais delas são) e adiciona uma maneira um pouco diferente de fazer o que o John1024 está fazendo :

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=: faz essencialmente a mesma coisa que o read -d: de John; quebra a entrada em : (e não no espaço ou tabulação); então, como a resposta de John, isso lida com diretórios com espaços em branco em seus nomes corretamente. read -a path_components lê a entrada em um a rray; "${path_components[@]" se expande para uma lista dos membros da matriz. Observe que echo "$dir" pode ser perigoso if $dir começa com - ou contém \ . (É verdade que estes são raros para nomes de diretório em $PATH .) printf "$dir" pode ser perigoso se $dir contiver % .

por 13.04.2017 / 14:36
0

Você pode experimentar também:

#!/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

Com arr=$(echo $PATH | tr ":" "\n") , você divide os diretórios em uma variável e a echo -e adiciona cor vermelha ao display para chamar a atenção.

A saída será como segue:

/usr/lib/qt-3.3/bin -> Exists

/usr/local/sbin -> Exists

/usr/local/bin -> Exists

/sbin -> Exists

/bin -> Exists

/usr/sbin -> Exists

/usr/bin -> Exists

/root/bin -> Missing!!!

    
por 18.11.2015 / 07:14