Есть ли способ проверить, есть ли ошибка при выполнении команды?
Пример:
test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1
function valid () {
if $test -eq 1; then
echo "OK"
else echo "ERROR"
fi
}
Я уже пробовал это, но, похоже, это не так за работой. Я не знаю, как это сделать.
Следует отметить, что , если ... тогда ... fi
и & amp; & amp;
/ ||
с возвратом полученного результата командой, которую мы хотим проверить (0 на успех); однако некоторые команды не возвращают ненулевой статус выхода, если команда не выполнена или не может обрабатывать ввод. Это означает, что обычные подходы , если
и & amp;
/ ||
не будут работать для этих конкретных команд.
Например, в Linux GNU файл
по-прежнему выходит с 0, если он получил несуществующий файл в качестве аргумента, а find
не смог найти указанный файл.
$ find. -name "not_existing_file" $ echo $? 0 $ file ./not_existing_file ./not_existing_file: невозможно открыть файл `./not_existing_file '(Нет такого файла или каталога) $ echo $? 0
В таких случаях одним из возможных способов справиться с ситуацией является чтение сообщений stderr
/ stdin
, например. те, которые возвращаются командой file
, или выполняют синтаксический анализ команды, подобной в , находят
. Для этих целей можно использовать оператор case
.
$ file ./doesntexist | в то время как IFS = read -r output; do & gt; case "$ output" в & gt; * «Нет такого файла или каталога» *) printf «% s \n» «Это будет отображаться, если не удалось» ;; & GT; *) printf "% s \n" "Это будет отображаться, если выполнено" ;; & GT; esac & gt; done Это будет отображаться, если не удалось найти $ find. -name "doesn'texist" | если ! читать IFS = out; затем echo «Файл не найден»; fi Файл не найден
(Это ответ моего собственного ответа на вопрос, связанный с , на unix.stackexchange.com )
Если вам нужно только знать, была ли команда успешной или неудачной, не утруждайте себя тестированием $?
, просто проверьте команду напрямую. Например ::!!5]
, если some_command; то printf 'some_command преуспел \n' else printf 'some_command failed \n' fi
И присвоение результата переменной не изменяет возвращаемое значение (ну, если оно не ведет себя иначе, если stdout, конечно, не является терминалом).
, если output = $ (some_command); затем printf 'some_command succeded, выход был «% s» \n' "$ output" fi
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals объясняет , если
более подробно.
команда & amp; & amp; echo OK || echo Failed
Для проверки ошибок ваших команд:
выполнить [INVOKING-FUNCTION] [COMMAND]
выполнить () {error = $ ($ 2 2 & gt; 1 & dev / null), если [$? -ne 0]; затем echo «1: $ error» exit 1 fi}
Вдохновленный в Lean production:
Итак, что-то вроде:
cd / nonexistant, если [$? -ne 0], тогда эхо не удалось еще успеху echo! fi
для большинства случаев, проще использовать & amp; & amp; построить цепочку команд, которые должны зависеть друг от друга. Таким образом, cd / nonexistant & amp; & amp; echo success!
не будет не успехом эха, потому что команда прерывается до & amp; & amp ;. Следствием этого является ||, где cd / nonexistant || echo fail
выйдет из echo, потому что cd не удался. (это становится полезным, если вы используете что-то вроде || exit, что закончит скрипт, если предыдущая команда не удалась.)
Следует отметить, что , если ... тогда ... fi
и & amp; & amp;
/ ||
с возвратом полученного результата командой, которую мы хотим проверить (0 на успех); однако некоторые команды не возвращают ненулевой статус выхода, если команда не выполнена или не может обрабатывать ввод. Это означает, что обычные подходы , если
и & amp;
/ ||
не будут работать для этих конкретных команд.
Например, в Linux GNU файл
по-прежнему выходит с 0, если он получил несуществующий файл в качестве аргумента, а find
не смог найти указанный файл.
$ find. -name "not_existing_file" $ echo $? 0 $ file ./not_existing_file ./not_existing_file: невозможно открыть файл `./not_existing_file '(Нет такого файла или каталога) $ echo $? 0
В таких случаях одним из возможных способов справиться с ситуацией является чтение сообщений stderr
/ stdin
, например. те, которые возвращаются командой file
, или выполняют синтаксический анализ команды, подобной в , находят
. Для этих целей можно использовать оператор case
.
$ file ./doesntexist | в то время как IFS = read -r output; do & gt; case "$ output" в & gt; * «Нет такого файла или каталога» *) printf «% s \n» «Это будет отображаться, если не удалось» ;; & GT; *) printf "% s \n" "Это будет отображаться, если выполнено" ;; & GT; esac & gt; done Это будет отображаться, если не удалось найти $ find. -name "doesn'texist" | если ! читать IFS = out; затем echo «Файл не найден»; fi Файл не найден
(Это ответ моего собственного ответа на вопрос, связанный с , на unix.stackexchange.com )
команда & amp; & amp; echo OK || echo Failed
записывает ошибки в stderr, вы можете использовать команду 2 & gt; / dev / null & amp; & amp; & amp; echo OK || echo Ошибка
. [D2] 2 & gt; / dev / null перенаправляет вывод stderr на / dev / null
. Однако некоторые утилиты будут записывать ошибки в stdout (хотя это плохая практика). В этом случае вы можете опустить 2 из перенаправления, но вы потеряете любой результат из команды. Этот метод проверки успеха хорош для простой тернарной логики, но для более сложного поведения лучше проверить $?
для успеха команды или использовать метод блока , если
, описанный в @ geirha's ответ.
– Bender the Greatest
24 July 2017 в 16:27
Если вам нужно только знать, была ли команда успешной или неудачной, не утруждайте себя тестированием $?
, просто проверьте команду напрямую. Например ::!!5]
, если some_command; то printf 'some_command преуспел \n' else printf 'some_command failed \n' fi
И присвоение результата переменной не изменяет возвращаемое значение (ну, если оно не ведет себя иначе, если stdout, конечно, не является терминалом).
, если output = $ (some_command); затем printf 'some_command succeded, выход был «% s» \n' "$ output" fi
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals объясняет , если
более подробно.
$?
делает, поэтому вы ошибаетесь, говоря, что тестирование команды напрямую строго лучше.
– Timothy Swan
30 November 2017 в 19:53
Для проверки ошибок ваших команд:
выполнить [INVOKING-FUNCTION] [COMMAND]
выполнить () {error = $ ($ 2 2 & gt; 1 & dev / null), если [$? -ne 0]; затем echo «1: $ error» exit 1 fi}
Вдохновленный в Lean production:
Как упоминалось во многих других ответах, простой тест $?
будет делать, как это
, если [$? -eq 0]; то что-то; fi
Если вы хотите проверить, не сработала ли команда, вы можете использовать более короткую версию в bash
(но, возможно, overkill) следующим образом:
, если (($?)); то что-то; fi
Это работает с использованием арифметического режима (())
, поэтому, если команда вернула success
, то есть $ ? = 0
, тогда тест оценивается как ((0))
, который проверяется как false
, иначе он вернет true
.
Чтобы проверить успех, вы можете использовать:
, если! (($)?); то что-то; fi
, но это уже не намного меньше первого примера.