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

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

Пример:

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 ответ

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

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
ответ дан 31 July 2018 в 11:28
  • 1
    Что делать, если вы хотите сделать что-то другое, кроме разветвления, например, сохранить логическое значение из-за того, что это не удалось или нет в .ini? Тогда ваша выходная переменная не делает этого, но $? делает, поэтому вы неверно говорите, что тестирование команды напрямую строго лучше. – Timothy Swan 30 November 2017 в 19:53
[F1]
3
ответ дан 31 July 2018 в 11:28

Следует отметить, что тип подхода 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
ответ дан 31 July 2018 в 11:28
[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
ответ дан 31 July 2018 в 11:28
  • 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
ответ дан 2 August 2018 в 03:50
[F1]
18
ответ дан 2 August 2018 в 03:50
  • 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
ответ дан 2 August 2018 в 03:50
  • 1
    Что делать, если вы хотите сделать что-то другое, кроме разветвления, например, сохранить логическое значение из-за того, что это не удалось или нет в .ini? Тогда ваша выходная переменная не делает этого, но $? делает, поэтому вы неверно говорите, что тестирование команды напрямую строго лучше. – Timothy Swan 30 November 2017 в 19:53
[F1]
3
ответ дан 2 August 2018 в 03:50

Следует отметить, что тип подхода 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
ответ дан 2 August 2018 в 03:50
[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
ответ дан 2 August 2018 в 03:50
  • 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
ответ дан 4 August 2018 в 19:54
[F1]
18
ответ дан 4 August 2018 в 19:54
  • 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
ответ дан 4 August 2018 в 19:54
  • 1
    Что делать, если вы хотите сделать что-то другое, кроме разветвления, например, сохранить логическое значение из-за того, что это не удалось или нет в .ini? Тогда ваша выходная переменная не делает этого, но $? делает, поэтому вы неверно говорите, что тестирование команды напрямую строго лучше. – Timothy Swan 30 November 2017 в 19:53
[F1]
3
ответ дан 4 August 2018 в 19:54

Следует отметить, что тип подхода 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
ответ дан 4 August 2018 в 19:54
[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
ответ дан 4 August 2018 в 19:54
  • 1
    Это хорошо ... я могу держать ошибку вывода ?? !! , потому что в этом случае у меня есть 2 ошибки: командная ошибка & quot; текст & quot; ex, файл не найден и моя ошибка & quot; текст & quot; Например, в этом случае не выполнено – moata_u 7 March 2011 в 16:24
  • 2
[D5] $? должен иметь статус выхода предыдущей команды, который должен быть равен нулю для отсутствия ошибки.

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

  cd / nonexistant, если [$?  -ne 0], тогда эхо не удалось еще успеху echo!  fi  

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

10
ответ дан 6 August 2018 в 03:56
  команда & amp; & amp;  echo $?  ||  echo $?   
3
ответ дан 6 August 2018 в 03:56

Следует отметить, что , если ... тогда ... 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 )

0
ответ дан 6 August 2018 в 03:56
  команда & amp; & amp;  echo OK ||  echo Failed  
18
ответ дан 6 August 2018 в 03:56

Если вам нужно только знать, была ли команда успешной или неудачной, не утруждайте себя тестированием $? , просто проверьте команду напрямую. Например ::!!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 объясняет , если более подробно.

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

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

  выполнить [INVOKING-FUNCTION] [COMMAND]  

  выполнить () {error  = $ ($ 2 2 & gt; 1 & dev / null), если [$?  -ne 0];  затем echo «1: $ error» exit 1 fi}  

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

1
ответ дан 6 August 2018 в 03:56
[D5] $? должен иметь статус выхода предыдущей команды, который должен быть равен нулю для отсутствия ошибки.

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

  cd / nonexistant, если [$?  -ne 0], тогда эхо не удалось еще успеху echo!  fi  

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

10
ответ дан 7 August 2018 в 21:54
  команда & amp; & amp;  echo $?  ||  echo $?   
3
ответ дан 7 August 2018 в 21:54

Следует отметить, что , если ... тогда ... 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 )

0
ответ дан 7 August 2018 в 21:54
  команда & amp; & amp;  echo OK ||  echo Failed  
18
ответ дан 7 August 2018 в 21:54

Если вам нужно только знать, была ли команда успешной или неудачной, не утруждайте себя тестированием $? , просто проверьте команду напрямую. Например ::!!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 объясняет , если более подробно.

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

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

  выполнить [INVOKING-FUNCTION] [COMMAND]  

  выполнить () {error  = $ ($ 2 2 & gt; 1 & dev / null), если [$?  -ne 0];  затем echo «1: $ error» exit 1 fi}  

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

1
ответ дан 7 August 2018 в 21:54
[D5] $? должен иметь статус выхода предыдущей команды, который должен быть равен нулю для отсутствия ошибки.

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

  cd / nonexistant, если [$?  -ne 0], тогда эхо не удалось еще успеху echo!  fi  

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

10
ответ дан 10 August 2018 в 10:09
  команда & amp; & amp;  echo $?  ||  echo $?   
3
ответ дан 10 August 2018 в 10:09

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

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