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

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

Пример:

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 }

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

165
задан 7 March 2011 в 17:41

71 ответ

Возвращаемое значение сохраняется в $?. 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.

211
ответ дан 25 May 2018 в 22:39
  • 1
    Это хорошо ... я могу держать ошибку вывода ?? !! , потому что в этом случае у меня есть 2 ошибки: командная ошибка " текст " ex, файл не найден и моя ошибка " текст " Например, в этом случае не выполнено – moata_u 7 March 2011 в 16:28
  • 2
    @moata_u: вы можете сохранить значение в переменной, как показано в моем ответе. – Lekensteyn 7 March 2011 в 17:14
  • 3
    @moata_u: вам нужно поставить ; перед else и fi: `if ...; тогда ...; еще ...; фи – Lekensteyn 7 March 2011 в 18:36
  • 4
  • 5
    @Blauhirn [ $? ] (или, что то же самое, test $?) не работает, потому что $? оценивает число (0, 1 и т. Д.), Которое не является нулевым. См. docs для test : " Если EXPRESSION опущено, 'test' возвращает false. Если EXPRESSION является единственным аргументом, «test» возвращает false, если аргумент имеет значение null и true в противном случае. & Quot; – Lekensteyn 25 March 2016 в 22:31

Возвращаемое значение сохраняется в $?. 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.

227
ответ дан 25 July 2018 в 22:23

Возвращаемое значение сохраняется в $?. 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.

228
ответ дан 26 July 2018 в 21:08

Возвращаемое значение сохраняется в $?. 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.

228
ответ дан 31 July 2018 в 11:28

Возвращаемое значение сохраняется в $?. 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.

229
ответ дан 2 August 2018 в 03:50

Возвращаемое значение сохраняется в $?. 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.

229
ответ дан 4 August 2018 в 19:54

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

  some_command, если [$?  -eq 0];  затем echo OK else echo FAIL fi  

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

  some_command retval = $?  do_something $ retval, если [$ retval -ne 0];  then echo «Код возврата не был равен нулю, но $ retval» fi  

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

229
ответ дан 6 August 2018 в 03:56

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

  some_command, если [$?  -eq 0];  затем echo OK else echo FAIL fi  

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

  some_command retval = $?  do_something $ retval, если [$ retval -ne 0];  then echo «Код возврата не был равен нулю, но $ retval» fi  

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

229
ответ дан 7 August 2018 в 21:54

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

  some_command, если [$?  -eq 0];  затем echo OK else echo FAIL fi  

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

  some_command retval = $?  do_something $ retval, если [$ retval -ne 0];  then echo «Код возврата не был равен нулю, но $ retval» fi  

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

231
ответ дан 10 August 2018 в 10:09

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

  some_command, если [$?  -eq 0];  затем echo OK else echo FAIL fi  

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

  some_command retval = $?  do_something $ retval, если [$ retval -ne 0];  then echo «Код возврата не был равен нулю, но $ retval» fi  

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

231
ответ дан 13 August 2018 в 16:30
  • 1
    Это хорошо ... я могу держать ошибку вывода ?? !! , потому что в этом случае у меня есть 2 ошибки: командная ошибка & quot; текст & quot; ex, файл не найден и моя ошибка & quot; текст & quot; Например, в этом случае не выполнено – moata_u 7 March 2011 в 16:28
  • 2
    @moata_u: вы можете сохранить значение в переменной, как показано в моем ответе. – Lekensteyn 7 March 2011 в 17:14
  • 3
    @moata_u: перед else и fi вам нужно поставить ; : `if ...; тогда ...; еще ...; фи – Lekensteyn 7 March 2011 в 18:36
  • 4
  • 5
    @Blauhirn [$? ] (или, что эквивалентно, test $? ) не работает, потому что $? оценивает число (0, 1 и т. д.), которое не является нулевым. См. [D0] docs для теста : & quot; Если EXPRESSION опущено, 'test' возвращает false. Если EXPRESSION является единственным аргументом, «test» возвращает false, если аргумент имеет значение null и true в противном случае. & Quot; – Lekensteyn 25 March 2016 в 22:31

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

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 более подробно.

57
ответ дан 25 May 2018 в 22:39
  • 1
    Что делать, если вы хотите сделать что-то другое, кроме разветвления, например, сохранить логическое значение из-за того, что это не удалось или нет в .ini? Тогда ваша выходная переменная не делает этого, но $? делает, поэтому вы неверно говорите, что тестирование команды напрямую строго лучше. – Timothy Swan 30 November 2017 в 19:53
[F1]
16
ответ дан 25 May 2018 в 22:39
  • 1
    Если command возвращает ошибку на экране, как ее скрыть? – Sigur 21 April 2017 в 04:51
  • 2
    Если command записывает ошибки в stderr, вы можете использовать форму command 2> /dev/null && echo OK || echo Failed. [F3] перенаправляет вывод stderr на /dev/null. Однако некоторые утилиты будут записывать ошибки в stdout (хотя это плохая практика). В этом случае вы можете опустить 2 из перенаправления, но вы потеряете любой результат из команды. Этот метод проверки успеха хорош для простой тернарной логики, но для более сложного поведения лучше проверить $? для успеха команды или использовать метод блока if, описанный в ответе @ geirha. – Bender the Greatest 24 July 2017 в 16:27
$? должен содержать статус выхода предыдущей команды, который должен быть равен нулю для отсутствия ошибки.

Итак, что-то вроде:

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

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

10
ответ дан 25 May 2018 в 22:39
  • 1
    Это хорошо ... я могу держать ошибку вывода ?? !! , потому что в этом случае у меня есть 2 ошибки: командная ошибка " текст " ex, файл не найден и моя ошибка " текст " Например, в этом случае не выполнено – moata_u 7 March 2011 в 16:24
  • 2
[F1]
3
ответ дан 25 May 2018 в 22:39

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

execute [INVOKING-FUNCTION] [COMMAND]
execute () {
    error=$($2 2>&1 >/dev/null)

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

исправление ошибок в Lean production: [ ! d4] Сделать ошибки невозможными по дизайну Сделать шаги наименьшими элементами Finish по одному Сделать это очевидным для любого

1
ответ дан 25 May 2018 в 22:39

Следует отметить, что тип подхода 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
ответ дан 25 May 2018 в 22:39

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

execute [INVOKING-FUNCTION] [COMMAND] execute () { error=$($2 2>&1 >/dev/null) if [ $? -ne 0 ]; then echo "$1: $error" exit 1 fi }

исправление ошибок в Lean production: [ ! d4] Сделать ошибки невозможными по дизайну Сделать шаги наименьшими элементами Finish по одному Сделать это очевидным для любого

1
ответ дан 25 July 2018 в 22:23
[F1]
18
ответ дан 25 July 2018 в 22:23
  • 1
    Если command возвращает ошибку на экране, как ее скрыть? – Sigur 21 April 2017 в 04:51
  • 2
    Если command записывает ошибки в stderr, вы можете использовать форму command 2> /dev/null && echo OK || echo Failed. [F3] перенаправляет вывод stderr на /dev/null. Однако некоторые утилиты будут записывать ошибки в stdout (хотя это плохая практика). В этом случае вы можете опустить 2 из перенаправления, но вы потеряете любой результат из команды. Этот метод проверки успеха хорош для простой тернарной логики, но для более сложного поведения лучше проверить $? для успеха команды или использовать метод блока if, описанный в ответе @ geirha. – Bender the Greatest 24 July 2017 в 16:27

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

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 более подробно.

58
ответ дан 25 July 2018 в 22:23
  • 1
    Что делать, если вы хотите сделать что-то другое, кроме разветвления, например, сохранить логическое значение из-за того, что это не удалось или нет в .ini? Тогда ваша выходная переменная не делает этого, но $? делает, поэтому вы неверно говорите, что тестирование команды напрямую строго лучше. – Timothy Swan 30 November 2017 в 19:53
[F1]
3
ответ дан 25 July 2018 в 22:23

Следует отметить, что тип подхода 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
ответ дан 25 July 2018 в 22:23
[D0] $? должен содержать статус выхода предыдущей команды, который должен быть равен нулю для отсутствия ошибки.

Итак, что-то вроде:

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

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

10
ответ дан 25 July 2018 в 22:23
  • 1
    Это хорошо ... я могу держать ошибку вывода ?? !! , потому что в этом случае у меня есть 2 ошибки: командная ошибка & quot; текст & quot; ex, файл не найден и моя ошибка & quot; текст & quot; Например, в этом случае не выполнено – moata_u 7 March 2011 в 16:24
  • 2

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

execute [INVOKING-FUNCTION] [COMMAND] execute () { error=$($2 2>&1 >/dev/null) if [ $? -ne 0 ]; then echo "$1: $error" exit 1 fi }

исправление ошибок в Lean production: [ ! d4] Сделать ошибки невозможными по дизайну Сделать шаги наименьшими элементами Finish по одному Сделать это очевидным для любого

1
ответ дан 26 July 2018 в 21:08
[F1]
18
ответ дан 26 July 2018 в 21:08
  • 1
    Если command возвращает ошибку на экране, как ее скрыть? – Sigur 21 April 2017 в 04:51
  • 2
    Если command записывает ошибки в stderr, вы можете использовать форму command 2> /dev/null && echo OK || echo Failed. [F3] перенаправляет вывод stderr на /dev/null. Однако некоторые утилиты будут записывать ошибки в stdout (хотя это плохая практика). В этом случае вы можете опустить 2 из перенаправления, но вы потеряете любой результат из команды. Этот метод проверки успеха хорош для простой тернарной логики, но для более сложного поведения лучше проверить $? для успеха команды или использовать метод блока if, описанный в ответе @ geirha. – Bender the Greatest 24 July 2017 в 16:27

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

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 более подробно.

58
ответ дан 26 July 2018 в 21:08
  • 1
    Что делать, если вы хотите сделать что-то другое, кроме разветвления, например, сохранить логическое значение из-за того, что это не удалось или нет в .ini? Тогда ваша выходная переменная не делает этого, но $? делает, поэтому вы неверно говорите, что тестирование команды напрямую строго лучше. – Timothy Swan 30 November 2017 в 19:53
[F1]
3
ответ дан 26 July 2018 в 21:08

Следует отметить, что тип подхода 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
ответ дан 26 July 2018 в 21:08
[D0] $? должен содержать статус выхода предыдущей команды, который должен быть равен нулю для отсутствия ошибки.

Итак, что-то вроде:

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

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

10
ответ дан 26 July 2018 в 21:08
  • 1
    Это хорошо ... я могу держать ошибку вывода ?? !! , потому что в этом случае у меня есть 2 ошибки: командная ошибка & quot; текст & quot; ex, файл не найден и моя ошибка & quot; текст & quot; Например, в этом случае не выполнено – moata_u 7 March 2011 в 16:24
  • 2

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

execute [INVOKING-FUNCTION] [COMMAND] execute () { error=$($2 2>&1 >/dev/null) if [ $? -ne 0 ]; then echo "$1: $error" exit 1 fi }

исправление ошибок в Lean production: [ ! d4] Сделать ошибки невозможными по дизайну Сделать шаги наименьшими элементами Finish по одному Сделать это очевидным для любого

1
ответ дан 31 July 2018 в 11:28
[F1]
18
ответ дан 31 July 2018 в 11:28
  • 1
    Если command возвращает ошибку на экране, как ее скрыть? – Sigur 21 April 2017 в 04:51
  • 2
    Если command записывает ошибки в stderr, вы можете использовать форму command 2> /dev/null && echo OK || echo Failed. [F3] перенаправляет вывод stderr на /dev/null. Однако некоторые утилиты будут записывать ошибки в stdout (хотя это плохая практика). В этом случае вы можете опустить 2 из перенаправления, но вы потеряете любой результат из команды. Этот метод проверки успеха хорош для простой тернарной логики, но для более сложного поведения лучше проверить $? для успеха команды или использовать метод блока if, описанный в ответе @ geirha. – Bender the Greatest 24 July 2017 в 16:27

Другие вопросы по тегам:

Похожие вопросы: