Bash에서 마지막으로 실패한 명령

Bash에서 마지막으로 실패한 명령

$?변수는 마지막 명령 실행의 종료 상태를 보유합니다. 명령 자체의 마지막 실행을 보유하는 변수가 있습니까?

答え1

fc이전 명령줄을 가져오는 데 사용됩니다 . 일반적으로 즐겨 사용하는 편집기에서 이전 명령줄을 편집하는 데 사용되지만 "목록" 모드도 있습니다.

last_command="$(fc -nl -1)"

答え2

만약에$_마지막 명령은 인수 없이 실행되며 변수 에 저장됩니다 . 여기에는 일반적으로 다음이 포함됩니다.마지막 인수이전 명령의 값 - 따라서 인수가 없으면 값은 $_마지막 명령 자체입니다.

또 다른 옵션은 최종 세부정보를 얻는 것입니다.배경주문하다. l0b0이 쓴 대로 $!PID를 저장하여 출력을 구문 분석할 수 있습니다 ps $!(추가 형식 지정 옵션 사용 가능 ps).

答え3

이것DEBUG간단한 명령을 실행하기 전에 명령을 실행할 수 있습니다. 실행될 명령의 문자열 버전(공백으로 구분된 단어)은 다음에서 찾을 수 있습니다.BASH_COMMAND바꾸다.

trap 'previous_command=$this_command; this_command=$BASH_COMMAND' DEBUG
echo "last command is $previous_command"

이는 previous_command명령을 실행할 때마다 변경되므로 사용할 수 있도록 변수에 저장하세요. 이전 명령의 반환 상태도 알고 싶다면 두 명령을 하나의 명령에 저장하세요.

cmd=$previous_command ret=$?
if [ $ret -ne 0 ]; then echo "$cmd failed with error code $ret"; fi

명령이 실패할 경우 중단하고 싶다면 다음을 사용하세요.set -e첫 번째 실패한 명령에서 스크립트가 종료되도록 합니다. 마지막 명령을 표시할 수 있습니다.EXIT.

set -e
trap 'echo "exit $? due to $previous_command"' EXIT

어떤 목적에 효과가 있을 수 있는 또 다른 접근 방식은 다음과 같습니다.set -x스크립트 실행 추적을 인쇄하고 추적의 마지막 몇 줄을 검사합니다.

答え4

set -eand options 가 있을 때 마지막으로 실패한 명령을 찾는 것이 중요하다고 생각합니다 set -o pipefail. 그렇지 않으면 bash는 이유에 대한 피드백 없이 단순히 중단되므로 이것이 잘 작동한다고 생각합니다.

#!/usr/bin/env bash
set -eu
set -o pipefail

cur_command=
first_err_command=
first_err_lineno=
# This trap is executed in exactly the same conditions in which the `set -e` results in an exit.
trap 'cur_command=$BASH_COMMAND;
      if [[ -z "$first_err_command" ]]; then
          first_err_command=$cur_command;
          first_err_lineno=$LINENO;
      fi' ERR
trap 'if [[ ! -z "$first_err_command" ]]; then
          echo "ERROR: Aborting at line: $first_err_lineno on command: $first_err_command";
      fi' EXIT

echo "The following command causes bash to abort, but it should also result in a nice message"
false
echo "This message is not expected"

위의 명령을 실행하면 다음과 같은 결과가 출력됩니다.

The following command causes bash to abort, but it should also result in a nice message
ERROR: Aborting at line: 22 on command: false

줄 번호가 항상 정확하지는 않을 수도 있지만 유용할 정도로 가까워야 합니다.

関連情報