Есть ли программный способ узнать, почему я не могу написать файл в сценарии оболочки (файл существует, доступ запрещен, полная файловая система и т. Д.)?Могу ли я узнать, почему я не могу написать файл в сценарии оболочки?
Например, в C одном использует переменную errno
для этого:
FILE *fp = fopen("/etc/passwd", "w");
if (!fp) {
if (errno == EACCES) {
// ...
}
else if (errno == EEXISTS) {
// ...
}
}
Могу ли я сделать что-то подобное с помощью сценариев оболочки?
Мой тестовый сценарий:
#!/bin/sh
err=$(echo 'x' 2>&1 > /etc/passwd)
if [ $? -ne 0 ]; then
echo "An error occured: $err"
exit 1
fi
Запуск этого, как не суперпользователя, даст вам:
An error occured: 'test.sh: line 3: /etc/passwd: Permission denied'
Проверка содержимого $err
является не очень хорошее ИМХО решение ; сообщение об ошибке может измениться в будущем и зависит от настроек пользователя locale
.
Я также знаю, что я могу сделать stat
& некоторые другие проверки перед созданием файла или после того, как код выхода отличен от нуля; но это быстро выходит из-под контроля, если вы хотите проверить все возможные ошибки. В некоторых случаях он также подвержен условиям гонки (например, файл создается между вашим test -f
и фактически записывает его).
Я использую оболочку POSIX и предпочитаю делать это с помощью POSIX-совместимого способа, но также допускается расширение или zsh
.
'' $ является кодом выхода/ошибки. это все, что вы получите, кроме фактического вывода строки, который вы захватываете. –