Назначение кода выхода локальной переменной оболочки

Не использовать sed , чтобы управлять XML, используйте вместо этого инструмент, поддерживающий XML, например xmlstarlet :

xmlstarlet ed -u '/user/@dn' -v 'String1, String2' input.xml
42
06.06.2015, 21:43
3 ответа

В зависимости от того, почему вы пытаетесь просто получить код выхода, вы также можете просто запустить if some-command; then echo "Success $?"; else echo "Failure $?"; fi, который ничего не делает с выводом команды, он просто оценивает код выхода команды run. Вы можете добавитьor(or$(around the command and you'll still get the same results. A better example might beif grep -q 'somestring' somefile; затем эхо "Найден какой-то код выхода $?"; else "Не удалось найти строку с кодом выхода $?"; фи `.

Вы также можете протестировать код возврата функции, который может быть явным return 3или подразумеваемым кодом возврата, который является результатом последней команды, в этом случае вам нужно быть осторожным, чтобы у вас не было echoв конце функции, иначе он маскирует/сбрасывает предыдущий код выхода.

command_last () {
  echo "True is `true`"
  echo "False is `false`"
  false
}
command_last; echo $?
# Outputs:
# True is 0
# False is 1
# 1

echo_last () {
  echo "True is `true`"
  echo "False is `false`"
  false
  # echo'ing literally anything (or nothing) returns true aka exit 0
  echo
}
echo_last; echo $?
# Outputs:
# True is 0
# False is 1
#            # Blank line due to empty echo
# 0

Наконец, грязный трюк, поскольку вы не можете выполнить VAR=(SOME_COMMAND), потому что VAR=()является определением массива, поэтому вам нужно VAR=( $(echo 'Some value') ).

-1
27.01.2020, 19:35

Это не дает точного ответа на этот вопрос, но я думаю, что в большинстве случаев вы будете принимать решения на основе полученного кода выхода позже в потоке выполнения. Если вам нужно проверить только код выхода успеха/неудачи — это легко сделать без сохранения кода в переменной:

if (exit 1); then
  echo "Command succeeded, alles gut"
else
  echo "Oi oi, Huston, we got alles kaputt 'round here"
fi
1
25.11.2020, 15:15

Ответ @mikeserv великолепен и дает объяснение поведения, которое я обнаружил, но понятия не имел, почему это происходит.

Я просто хотел добавить простой способ избежать localупотребления кода выхода подоболочки:

val_check_exit() {
   local val=
   val=$(echo "hi"; exit 1)
   local res=$?
   echo "val is ${val}, exit code ${res}"
}
val_check_exit
# outputs:
# val is hi, exit code 1
1
01.03.2021, 20:19

Теги

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