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

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

Пример:

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

Следует отметить, что , если ... тогда ... 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
ответ дан 10 August 2018 в 10:09

Если вам нужно только знать, была ли команда успешной или неудачной, не утруждайте себя тестированием $? , просто проверьте команду напрямую. Например ::!!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
ответ дан 10 August 2018 в 10:09
  команда & amp; & amp;  echo OK ||  echo Failed  
18
ответ дан 10 August 2018 в 10:09

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

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

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

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

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

Следует отметить, что , если ... тогда ... 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
ответ дан 13 August 2018 в 16:30
  команда & amp; & amp;  echo $?  ||  echo $?   
3
ответ дан 13 August 2018 в 16:30
  команда & amp; & amp;  echo OK ||  echo Failed  
18
ответ дан 13 August 2018 в 16:30
  • 1
    Если команда возвращает ошибку на экране, как ее скрыть? – Sigur 21 April 2017 в 04:51
  • 2
    Если команда записывает ошибки в 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 объясняет , если более подробно.

58
ответ дан 13 August 2018 в 16:30
  • 1
    Что делать, если вы хотите сделать что-то другое, кроме разветвления, например, сохранить логическое значение из-за того, что это не удалось или нет в .ini? Тогда ваша выходная переменная не делает этого, но $? делает, поэтому вы ошибаетесь, говоря, что тестирование команды напрямую строго лучше. – 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:

1
ответ дан 13 August 2018 в 16:30

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

 , если [$?  -eq 0];  то что-то;  fi  

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

 , если (($?));  то что-то;  fi  

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

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

 , если!  (($)?);  то что-то;  fi  

, но это уже не намного меньше первого примера.

0
ответ дан 19 August 2018 в 01:35

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

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