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
$PATH
significa o diretório atual. - Um
$PATH
vazio significa o diretório atual (ou seja,$PATH
contém um componente que é o diretório atual, portanto, o loopwhile read -d:
estaria errado nesse caso). -
//file
não é necessário o mesmo que/file
em algum sistema, portanto, se$PATH
contiver/
, 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: