history-명령 만 성공적으로 실행


10

history 명령 을 사용하는 방법이 있지만 성공적으로 실행 된 명령 만 나열 하는지 궁금합니다 . 마찬가지로 오류를 일으킨 항목을 나열하는 방법이 있습니까?

각 명령의 종료 상태는 다음과 같습니다.

0-명령 실행 성공
1-확장 또는 리디렉션 중에 오류로 인해 명령이 실패하고 종료 상태가 0보다 큽니다.
2-명령 사용법이 잘못
12되었습니다-명령을 찾았지만 실행할 수 없습니다
127-명령을 찾을 수 없습니다

http://www.linuxnix.com/2011/03/find-exit-status-script-command-linux.html echo $?
에서 명령을 진행하여 확인할 수 있습니다 .

예:

이 4 가지 명령을 실행 한 후 :

ls
help
lss
ls nonexistentfile

성공적인 명령 (종료 상태 0) 만 인쇄하도록 테스트를 시도했는데 'ls'와 'help'만 있어야합니다.

for j in `history | tail -5 | head -4 | cut -d ' ' -f5-`; do $j > cmd_out; if [[ `echo $?` != 0 ]]; then :; else echo $j | grep -v 'bash'; fi; done; rm cmd_out

이 결과는 다음과 같습니다.

ls
help
bash: lss: command not found
ls
bash: nonexistentfile.txt: command not found

이것은 다소 효과가 있지만 두 가지 문제가 있습니다.

  1. 어떤 이유로 grep -v 'bash''bash'가 포함 된 줄을 제외하지는 않지만 'bash' grep 'bash'가있는 줄만 포함하면 왜 하나가 작동하고 다른 것이 작동하는지 잘 모르겠습니다.
  2. 각 줄 / 명령을 문자열로 구분합니다. 마지막 ls명령은해야
    ls nonexistentfile하지만, 실행의 lsnonexistentfile별도의 명령으로.

내가 명령에서 무엇을 조정해야하는지 또는 어떻게해야하는지에 대한 아이디어가 있습니까?

답변:


4

이것은 내가 누가 무엇을했는지 추적하기 위해 공유 계정에서 한 번 사용한 해킹입니다.

PROMPT_COMMAND="history -a; sed -i '\$s/\$/ \#$NAME/' $HISTFILE; history -r; $PROMPT_COMMAND"

실제로는 각 명령 뒤에 표시 history되기 전을 씁니다 PROMPT. 히스토리에서 종료 코드 저장을 사용하도록이를 수정할 수 있습니다.

PROMPT_COMMAND="CODE=$?; history -a; sed -i '\$s/\$/ \#\$CODE/' $HISTFILE; history -r; $PROMPT_COMMAND"

그러면 기록에 다음과 같은 항목이 남습니다.

$ history 2
 1271  vim .bashrc #0
 1272  history 2

(마지막 항목은 업데이트됩니다 history 종료 코드는이 출력에 표시되지 않도록, 명령이 종료됩니다.)

이것은 프롬프트의 역사에 주석이 표시되는 성가신 효과가 있습니다.

$ # press up
$ history 2 #0

주석은 일반적으로 실행 또는 출력에 영향을 미치지 않지만 편집을 어렵게 만듭니다.

이제 grep히스토리에서 어떤 코드가 성공적으로 종료되었는지 확인할 수 있습니다.

history | grep '#0$'
# or grep '#[^0]*$' for unsuccessful commands.

나는 그것을 Mobaxterm과 Putty에서 시도 ls #$CODE, ll #$CODE하고 역사 결과를 얻었 습니다. 그것이 당신에게 효과가 있는지 확실하지 않지만로 변경 sed -i '\$s/\$/ \#\$CODE/' $HISTFILE'해야했습니다 sed -i '\$s/\$/ \#$CODE/' $HISTFILE. 나는
lkisac

@lkisac 이상하게도, 그것은 #탈출없이 (코드 없음)을 주었다 . 인용 문제가 있어야합니다.
muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.