이 $?
변수는 마지막 명령 실행의 종료 상태를 보유합니다. 명령 자체의 마지막 실행을 보유하는 변수가 있습니까?
답변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 -e
and 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
줄 번호가 항상 정확하지는 않을 수도 있지만 유용할 정도로 가까워야 합니다.