[unix] bash 스크립트 내의 히스토리 명령

History는 BASH 스크립트 내에서 사용할 수없는 셸 내장 명령입니다. BASH 스크립트를 사용하여 이것을 얻을 수있는 방법이 있습니까?
여기 우리는 당신을 위해 내 스크립트를 간다 :

#!/bin/bash
history |  tail -100 > /tmp/history.log
cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" hello@hel.com



답변

Bash는 기본적으로 비 대화식 쉘에서 히스토리를 사용하지 않지만 설정할 수 있습니다.

#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | tail 

그러나 해당 서버에서 활동을 모니터하려는 경우 쉘 히스토리는 쓸모가 없습니다 (히스토리에 표시되지 않은 명령을 실행하는 것은 쉽지 않습니다). Linux에서 모든 프로세스 실행을 기록하는 방법을 참조하십시오 .

스크립트를 디버깅하는 경우 쉘 기록이 유용한 정보를 얻는 가장 좋은 방법은 아닙니다. 훨씬 더 좋은 도구는 디버그 추적 기능 set -x입니다. 스크립트 상단 근처에 두십시오 . 추적이 표준 오류에 기록됩니다.


답변

비 대화식으로 실행할 때 실제로 히스토리 기능을 사용하는지 확실하지 않으면 실행하는 모든 쉘 스크립트가 명령 히스토리를 어지럽히 게됩니다.

소스로 직접 이동하지 왜 ${HOME}/.bash_history교체 history | tail -100와 함께 tail -100 ${HOME}/.bash_history. (타임 스탬프를 사용하는 경우 아마도의 행을 따라 무언가를 수행해야 할 것입니다 grep -v ^# ${HOME}/.bash_history | tail -100).


답변

history스크립트의 활성 쉘 세션에서 명령 출력을 사용하려면 별명을 사용하여 명령을 먼저 실행할 수 있습니다. 그런 다음 동일한 별명에서 나머지 스크립트를 호출 할 수 있습니다. 이러한 구성 history을 사용하면 실제 스크립트에서 명령 을 갖는 것과 본질적으로 동일한 결과를 얻을 수 있습니다 .

예를 들어, 스크립트 이름이 script.sh 인 경우 다음과 같이 별명을 작성할 수 있습니다.

alias hy_tmp='history | tail -100 > /tmp/history.log ; bash /patch/to/script.sh'

스크립트를 다음과 같이 변경하십시오.

#!/bin/bash
cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" hello@hel.com

~/bash_history두 컴퓨터에서 파일 을 결합, 정렬 및 동기화하는 프로세스를 작성하는 동안이 질문을 발견 했으므로 과거에 사용한 명령을 쉽게 검색 할 수 있습니다.

업데이트하기 위해 새 셸에 로그인하지 않고도 누적 기록 파일을 업데이트하는 것이 번거롭지 ~/bash_history않습니다. 다른 답변에서 언급했듯이 서버 모니터링의 경우 분명히 작동하지 않습니다.

특히 내 사용법은 다음과 같습니다.

alias hbye='history | cut -c 8- > /home/chris/.bash_history_c; bash /hby.sh

hby.sh그런 다음 스크립트 는 모든 ~/.bash_history*파일 에서 모든 고유 항목을 가져옵니다 .


답변

쉘 스크립트 내에서 히스토리 내장 기능이 사용 불가능한 것으로 보입니다. 여기를 참조하십시오 : http://www.tldp.org/LDP/abs/html/histcommands.html

이에 대한 공식 문서를 찾지 못했습니다.


답변

script.sh아래와 같은 스크립트를 작성하십시오 . X라는 스크립트를 작성하고 Y 행의 히스토리 라인을 넣습니다.

#!/bin/bash
SCRIPT_NAME=$1
NUMBER_OF_LINES_BACK=$2

# Enable History in a non interactive shell
HISTFILE=~/.bash_history
set -o history

# echo shabang line and x number of lines of history to new script
echo \#\!\/bin\/bash > $SCRIPT_NAME.sh; history | tail -n $NUMBER_OF_LINES_BACK >> $SCRIPT_NAME.sh;
chmod u+x $SCRIPT_NAME.sh;

# Open the newly created script with vim
vim $SCRIPT_NAME.sh;
~

그런 다음 마지막 14 행 동안 작업 한 “task”라는 태스크를 수행하기위한 스크립트를 작성하려면

script.sh task 14

그런 다음 역사를 정리하여 멋진 대본을 만드십시오!


답변

history 명령은 bash 스크립트에서 기본적으로 비활성화되어 있기 때문에 history 명령조차도 .sh 파일에서 작동하지 않습니다. 리디렉션을 위해 .sh 파일 내에서 bash_history 파일을 친절하게 리디렉션하십시오.

또는 히스토리 메커니즘은 히스토리 파일을 언급하고 아래에 언급 된대로 런타임 매개 변수를 변경하여 활성화 할 수 있습니다.

#!/bin/bash
HISTFILE=~/.bash_history
set -o history 

참고 : 스크립트 파일 맨 위에 두 줄이 있습니다. 이제 history 명령이 역사에서 작동합니다.


답변

모든 사용자에게는 history 명령의 결과 인 자체 기록 파일이 있습니다. 쉘 스크립트에서 history 명령을 사용하는 대신 사용자에 대한 기록 파일을 사용할 수 있습니다. 있을 것이다 .bash_history사용자에 대한 기록 파일됩니다 사용자의 홈 디렉토리에있는 파일.