read usa IFS para separar as palavras na linha que lê, ele não diz read para ler até a primeira ocorrência de qualquer um dos caracteres nele.
IFS=: read -r a b
Gostaria de ler uma linha, colocar a parte antes do primeiro : em $a e o restante em $b .
IFS=: read -r a
colocaria a linha inteira (o restante) em $a (exceto se essa linha contiver apenas um : e for o último caractere na linha).
Se você quiser ler até o primeiro : , use read -d: ( ksh93 , zsh ou bash apenas).
printf %s "$PATH" | while IFS= read -rd: dir || [ -n "$dir" ]; do
...
done
(não estamos usando <<< , pois adiciona um caractere extra de nova linha).
Ou você pode usar a divisão de palavras padrão:
IFS=:; set -o noglob
for dir in $PATH""; do
...
done
Agora, cuidado com algumas ressalvas:
- Um componente vazio
$PATHsignifica o diretório atual. - Um
$PATHvazio significa o diretório atual (ou seja,$PATHcontém um componente que é o diretório atual, portanto, o loopwhile read -d:estaria errado nesse caso). -
//filenão é necessário o mesmo que/fileem algum sistema, portanto, se$PATHcontiver/, você precisa ter cuidado com itens como$dir/$file. - Um unset $ PATH significa que um caminho de busca padrão deve ser usado, não é o mesmo que um conjunto, mas vazio $ PATH.
Agora, se for apenas o equivalente ao comando tcsh / zsh where , você pode usar bash ' type -a .
Mais leitura: