Есть ли способ проверить, есть ли ошибка при выполнении команды?
Пример :
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
}
Я уже пытался сделать это, но кажется, что это не работает. Я не как это сделать.
command-line
moata_u
источник
источник
valid
), прежде чем вызывать ее.Ответы:
Возвращаемое значение сохраняется в
$?
. 0 указывает на успех, другие указывают на ошибку.Как и любое другое текстовое значение, вы можете сохранить его в переменной для последующего сравнения:
Для возможных операторов сравнения, см
man test
.источник
;
передelse
иfi
: `if ...; тогда ...; еще ...; фиtest
.[ $? ]
(или, что то же самое,test $?
) не работает, поскольку$?
вычисляет число (0, 1 и т. Д.), Которое не равно нулю. См. Документы дляtest
: «Если EXPRESSION опущено,« test »возвращает false. Если EXPRESSION является единственным аргументом,« test »возвращает false, если аргумент равен нулю и true в противном случае».Если вам нужно только знать, была ли команда выполнена успешно или нет, не беспокойтесь о тестировании
$?
, просто протестируйте команду напрямую. Например:И присвоение вывода переменной не меняет возвращаемого значения (ну, если, конечно, он не ведет себя иначе, когда stdout не является терминалом).
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals объясняет
if
более подробно.источник
$?
делает, так что вы ошибаетесь, говоря, что тестирование команды напрямую лучше.local
команда, т.local foo=$(false); echo $?;
Е. Производится0
на выходе. Ноlocal
относится только к функциям bash.источник
command
на экране появляется ошибка, как ее скрыть?command
записываете ошибки в stderr, вы можете использовать формуcommand 2> /dev/null && echo OK || echo Failed
. В2> /dev/null
переадресовывает вывод на стандартный вывод/dev/null
. Однако некоторые утилиты будут записывать ошибки в стандартный вывод (даже если это плохая практика). В этом случае вы можете опустить 2 из перенаправления, но вы потеряете любой вывод команды. Этот метод проверки успешности хорош для простой троичной логики, но для более сложного поведения лучше всего проверить$?
успешность команды или использоватьif
блочный метод, описанный в ответе @ geirha.$? должен содержать статус выхода предыдущей команды, который должен быть нулевым для отсутствия ошибок.
Итак, что-то вроде;
в большинстве случаев проще использовать конструкцию && для объединения команд, которые должны зависеть друг от друга. Так
cd /nonexistant && echo success!
что не повторило бы успех, потому что команда прерывается до &&. Следствием этого является ||, гдеcd /nonexistant || echo fail
будет эхо-сбой, потому что CD-сбой. (это становится полезным, если вы используете что-то вроде || exit, что завершит работу сценария, если предыдущая команда не удалась.)источник
источник
command; echo $?
?true && echo $? || echo $?
/true; echo $?
иfalse && echo $? || echo $?
/false; echo $?
- вы обнаружите, что они делают одно и то же: Dcommand && echo "success: $?" || echo "fail: $?"
Следует отметить, что
if...then...fi
и&&
/||
тип подхода имеет дело с состоянием выхода, возвращаемым командой, которую мы хотим проверить (0 в случае успеха); однако некоторые команды не возвращают ненулевой статус выхода, если команда не выполнена или не может обработать ввод. Это означает, что обычныйif
и&&
/||
подходы не будут работать для этих конкретных команд.Например, в Linux GNU по-
file
прежнему завершает работу с 0, если он получил несуществующий файл в качестве аргумента иfind
не может найти указанный файл пользователем.В таких случаях одним из возможных способов справиться с ситуацией является чтение
stderr
/stdin
сообщения, например, те, которые были возвращеныfile
командой, или анализ выходных данных команды, как вfind
. Для этогоcase
можно использовать заявление.(Это репост моего собственного ответа на связанный вопрос на unix.stackexchange.com )
источник
Как уже упоминалось во многих других ответов, простой тест
$?
будет делать, как этоЕсли вы хотите проверить , если команда не удалось , вы можете использовать более короткую версию в
bash
(но , возможно , избыточна) следующим образом :Это работает с использованием
(( ))
арифметического режима, поэтому, если команда вернуласьsuccess
, то есть$? = 0
тогда тест оценивает, к((0))
каким тестам какfalse
, иначе он вернетсяtrue
.Чтобы проверить успех , вы можете использовать:
но это уже не намного короче, чем первый пример.
источник
Для проверки ошибок ваших команд:
Вдохновленный в Бережливом производстве:
источник
if [$ (команда)]; тогда эхо "преуспевает"; фи
источник
true
удается,if [ $(true) ]; then echo "succeed"; fi
ноsucceed
не печатается. На самом деле это никогда не проверяет, если этоcommand
удалось. Это следует использоватьif command
как в сообщении гейры .$(
)
это подстановка команды .[
]
это условное выражение . Отсутствие разбиения по словам и расширения имени файла , это в основном проверяет, были лиcommand
выходные данные.