O problema no seu script é que o programa awk
define o primeiro campo para a cadeia vazia. Ao fazer isso, você não o exclui e, portanto, obtém um espaço (o separador de campos de saída padrão) como o primeiro caractere da variável de shell path
. pushd
não consegue encontrar os diretórios que você está alimentando devido ao espaço no início dos nomes, e é aí que você obtém os erros.
Em vez disso, você pode fazer algo como
sed 's/^[[:blank:]]*[0-9]*[[:blank:]]*//' <"$1" |
while IFS= read -r pathname; do
pushd "${pathname/#\~\//$HOME/}"
done
O sed
remove todos os espaços em branco e números iniciais do início da linha antes que read
o leia.
Como discutido nos comentários: A substituição ${pathname/#\~\//$HOME/}
só substituiria o til se ocorresse junto com /
no início de $pathname
. Para lidar com um ~
, você pode ter que adicionar uma substituição separada, ou algo parecido com
case "$pathname" in
"~") pathname=$HOME ;;
"~/"*) pathname=${pathname/#\~/$HOME} ;;
esac
pushd "$pathname"
Se o arquivo de entrada foi criado usando dirs -l -p
, o loop seria ainda mais simples:
while IFS= read -r pathname; do
pushd "$pathname"
done <"$1"