Проблема в вашем сценарии заключается в том, что ваша awk
программа устанавливает первое поле в пустую строку. При этом вы не удаляете его, и поэтому вы получаете пробел (разделитель выходного поля по умолчанию )в качестве первого символа в вашей переменной оболочки path
. pushd
не может найти каталоги, которые вы ему подаете, из-за пробела в начале имен, и отсюда вы получаете ошибки.
Вместо этого вы можете сделать что-то вроде
sed 's/^[[:blank:]]*[0-9]*[[:blank:]]*//' <"$1" |
while IFS= read -r pathname; do
pushd "${pathname/#\~\//$HOME/}"
done
sed
удаляет все начальные пробелы и цифры в начале строки до того, как read
ее прочитает.
Как обсуждалось в комментариях :, замена ${pathname/#\~\//$HOME/}
заменит тильду только в том случае, если она встречается вместе с /
в самом начале $pathname
. Для обработки одиночного ~
вам, возможно, придется добавить отдельную замену или что-то вроде
case "$pathname" in
"~") pathname=$HOME ;;
"~/"*) pathname=${pathname/#\~/$HOME} ;;
esac
pushd "$pathname"
Если бы входной файл был создан с помощью dirs -l -p
, то цикл был бы еще проще:
while IFS= read -r pathname; do
pushd "$pathname"
done <"$1"
Необходимо отключить управление потоком:
# pppd nodetach debug /dev/ttyUSB0 9600 -crtscts