Использование if является разумной защитой от неудачного изменения каталога.
Этот код будет выполнять команды в родительском каталоге, если каталог не является исполняемым (нет разрешения x ).
#!/bin/bash
drt="/var/www/html"
for dir in "${drt}"/*/
do pushd "$dir"
pwd
popd
done
Создайте пару каталогов, измените владельца и разрешения:
$ mkdir -p /var/www/html/{one,two}
$ sudo chown user:user /var/www/html/{one,two}
$ sudo chmod o-x /var/www/html/two
$./script
/var/www/html/one ~/temp
/var/www/html/one
~/temp
./script: line 5: pushd:./var/www/html/two/: Permission denied
~/temp
./script: line 7: popd: directory stack empty
Команда pushd выдала ошибку, но команда pwd была выполнена в каталоге ~/temp (обратите внимание на значение ~/temp, напечатанное сразу после ошибки ). Это явный риск сделать что-то не так. Сравните с этим скриптом:
#!/bin/bash
drt="./var/www/html"
for dir in "${drt}"/*/
do if pushd "$dir" 2>/dev/null
then
pwd
popd
fi
done
Выполнен новый скрипт:
$./script
/var/www/html/one ~/temp
/var/www/html/one
~/temp
Или даже лучше:
#!/bin/bash
drt="./var/www/html"
for dir in "${drt}"/*/
do if pushd "$dir" 2>/dev/null
then
pwd
popd
else
echo "Failed to change to dir=$dir" >&2
exit 7
fi
done
Который при выполнении выведет:
$./script
/var/www/html/one ~/temp
/var/www/html/one
~/temp
Failed to change to dir=/var/www/html/two/
Оказывается, проблема была в моей видеокарте. Использование видеокарты nvidia и драйверов не работало должным образом. Использовал nomodeset и отключил quicksplash в настройках для работы:)