Вопрос Как проверить, удалось ли выполнить команду?


Есть ли способ проверить, есть ли ошибка при выполнении команды?

Пример :

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
}

Я уже пытался это сделать, но, похоже, он не работает. Я не знаю, как это сделать.


162
2018-03-07 11:40


происхождения


предпочитать $ (Foo) над обратными окнами `Foo`, потому что вы можете вложить его в гнездо, и легче отличить от апострофов. - user unknown
BTW, вам нужно определить функцию (valid), прежде чем вы его назовете. - wjandrea


ответы:


Возвращаемое значение сохраняется в $?, 0 указывает на успех, другие указывают на ошибку.

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi

Как и любое другое текстовое значение, вы можете сохранить его в переменной для будущего сравнения:

some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi

Для возможных операторов сравнения см. man test,


240
2018-03-07 12:06



Это хорошо ... я могу держать ошибку вывода ?? !! , потому что в этом случае у меня есть 2 ошибки: командная ошибка «текст» ex, файл не найден и моя ошибка «текст», которая в этом случае не выполнена, например - moata_u
@moata_u: вы можете сохранить значение в переменной, как показано в моем ответе. - Lekensteyn
@moata_u: вам нужно поставить ; перед else а также fi: `if ...; тогда ...; еще ...; фи - Lekensteyn
Это бесполезное использование test, - David Foerster
@Blauhirn [ $? ] (или, что то же самое, test $?) не работает, потому что $? оценивает число (0, 1 и т. д.), которое не равно нулю. См. документы для test: «Если EXPRESSION опущено,« test »возвращает false. Если EXPRESSION является единственным аргументом,« test »возвращает false, если аргумент имеет значение null и true в противном случае». - Lekensteyn


Если вам нужно знать только, была ли команда успешной или неудачной, не утруждайте себя тестированием $?, просто проверьте команду напрямую. Например.:

if some_command; then
    printf 'some_command succeeded\n'
else
    printf 'some_command failed\n'
fi

И присвоение результата переменной не изменяет возвращаемое значение (ну, если оно не ведет себя иначе, когда stdout не является терминалом, конечно).

if output=$(some_command); then
    printf 'some_command succeded, the output was «%s»\n' "$output"
fi

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals объясняет if более детально.


60
2018-03-08 23:54



Что делать, если вы хотите сделать что-то другое, кроме разветвления, например, сохранить логическое значение из-за того, что это не удалось или нет в .ini? Тогда ваша выходная переменная этого не делает, но $? делает, поэтому вы ошибаетесь, говоря, что тестирование команды напрямую строго. - Timothy Swan


command && echo OK || echo Failed

19
2017-12-01 21:19



Если command возвращает ошибку на экране, как скрыть ее? - Sigur
Если command записывает ошибки в stderr, вы можете использовать форму command 2> /dev/null && echo OK || echo Failed, 2> /dev/null перенаправляет вывод stderr на /dev/null, Однако некоторые утилиты будут записывать ошибки в stdout (хотя это плохая практика). В этом случае вы можете опустить 2 из перенаправления, но вы потеряете любой результат из команды. Этот метод проверки успеха хорош для простой тернарной логики, но для более сложного поведения лучше всего проверить $? для успеха команды, или используйте if блочный метод, описанный в ответе @ geirha. - Bender the Greatest


$? должен содержать статус выхода предыдущей команды, который должен быть равен нулю для отсутствия ошибки.

Итак, что-то типа;

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

для большинства случаев проще использовать конструкцию && для цепочки команд, которые должны зависеть друг от друга. Так cd /nonexistant && echo success! бы не echo success, потому что команда прерывается до &&. Следствием этого является ||, где cd /nonexistant || echo fail  бы echo fail, потому что cd не удалось. (это становится полезным, если вы используете что-то вроде || exit, что закончит скрипт, если предыдущая команда не удалась.)


12
2018-03-07 12:04



Это хорошо ... я могу держать ошибку вывода ?? !! , потому что в этом случае у меня есть 2 ошибки: командная ошибка «текст» ex, файл не найден и моя ошибка «текст», которая в этом случае не выполнена, например - moata_u
@moata_u, см. mywiki.wooledge.org/BashFAQ/002 - geirha


command && echo $? || echo $?

4
2017-08-12 16:01





Для проверка ошибок ваши команды:

execute [INVOKING-FUNCTION] [COMMAND]

execute () {
    error=$($2 2>&1 >/dev/null)

    if [ $? -ne 0 ]; then
        echo "$1: $error"
        exit 1
    fi
}

вдохновенный в Lean production:


2
2017-12-29 04:20





Необходимо отметить, что if...then...fi а также &&/|| тип подхода относится к состоянию выхода, возвращенному командой, которую мы хотим проверить (0 на успех); однако некоторые команды не возвращают ненулевой статус выхода, если команда не выполнена или не может обрабатывать ввод. Это означает, что обычный if а также &&/|| подходы не будут работать для этих конкретных команд.

Например, на Linux GNU file все еще выходит с 0, если он получил несуществующий файл в качестве аргумента и find не удалось найти указанный пользователем файла.

$ find . -name "not_existing_file"                                          
$ echo $?
0
$ file ./not_existing_file                                                  
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0

В таких случаях одним из возможных способов справиться с ситуацией является чтение stderr/stdin сообщений. те, которые вернулись file команду или выполнить синтаксический анализ команды, как в find, Для этих целей, case может быть использован.

$ file ./doesntexist  | while IFS= read -r output; do                                                                                                                  
> case "$output" in 
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed

$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi                                                                                     
File not found

(Это ответ моего собственного ответа на вопрос на unix.stackexchange.com )


0
2017-11-13 18:58





Как упоминалось во многих других ответах, простой тест $? сделают это, как это

if [ $? -eq 0 ]; then something; fi

Если вы хотите проверить, если команда не смогли, вы можете использовать более короткую версию в bash (но, возможно, перебор) следующим образом:

if (($?)); then something; fi

Это работает, используя (( )) арифметический режим, поэтому, если команда вернулась success, т.е. $? = 0 то тест оценивает ((0)) который false, иначе он вернется true,

Проверить на успех, вы можете использовать:

if ! (($?)); then something; fi

но он уже не намного короче, чем первый пример.


0
2017-08-16 21:07