나는 간단한 것을 사용한다별명하나 이상의 터미널 창에서 "trace" 명령을 활성화합니다.
alias trackmi='export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"'
그럼 난 그냥 tail -f
내 꺼야.bash_history즉각적인 피드백을 얻으려면 작업 공간의 다른 터미널에 파일을 저장하세요. 방금 활성화했습니다무한한 역사 내 기록 형식을 업데이트했습니다( export HISTTIMEFORMAT="[%F %T] "
)..bashrc. 물론 이 history
명령은 타임스탬프를 표시합니다. 하지만체재기록 파일 자체는 다음과 같습니다.
#1401234303
alias
#1401234486
cat ../.bashrc
history
Unix 시간을 변환하고 숫자를 포함하여 command 와 마찬가지로 전체 명령을 한 줄에 표시하려면 어떻게 해야 합니까 ?
578 [2014-05-27 19:45:03] alias
579 [2014-05-27 19:48:06] cat ../.bashrc
...그리고 따라가세요. 아니면 history
명령의 출력을 터미널에 지속적으로 출력하는 방법을 찾으시나요 ?
답변1
GNU 사용 awk
:
tail -fn+1 ~/.bash_history | awk '
/^#/{printf "%-4d [%s] ", ++n, strftime("%F %T", substr($0, 2)); next}; 1'
답변2
기본적으로 쉘 기본값에서 몇 가지 명령만 사용하는 분할 화면 xterm에서 실행되는 최종 제품은 다음과 같습니다.
스크린샷에 표시된 것보다 더 조잡한 접근 방식은 다음과 같습니다.
PS1='$( { date ; fc -l -0 ; } >${TGT_PTY} )'$PS1
출력을 원하는 화면에서 실제로 대화형 셸을 실행할 때 ${TGT_PTY}
명령에서 얻은 내용은 어디에 있습니까 ? tty
또는 본질적으로 파일 리디렉션의 대상이기 때문에 쓰기 가능한 모든 파일을 사용할 수 있습니다.
나는 사용한다푸티구문은 다음과 같습니다의사 터미널나는 그것이 일종의 xterm이라고 가정하고 있기 때문에 쉽게 VT를 전용으로 지정할 수 있으며 스트리밍 기록에는 항상 단일 CTRL-ALT-Fn
키 조합만 필요합니다. 저라면 아마도 두 개념을 결합해서 전용 vt screen
세션 으로 만들겠지만 tmux
…
새로 부팅된 시스템에는 /bin/login
일반적인 Linux 콘솔 getty
에 있는 일반적인 프롬프트가 표시됩니다. CTRL-ALT-F2
덜 일반적인 콘솔에 액세스하기 위해 버튼을 누르면 콘솔 이 아닌 하나 kmscon
처럼 작동합니다 . 명령을 입력 하고 응답을 받습니다 .xterm
tty
tty
/dev/pts/0
일반적으로 xterms는 여러 용도로 단일 터미널 장치를 재사용합니다.의사 터미널- 따라서 터미널 탭이나 창 사이를 전환하여 X11에서 유사한 작업을 수행한다면 아마도 비슷한 출력을 받게 될 것입니다 /dev/pts/[0-9]*
. 그러나 키 조합을 통해 액세스되는 가상 터미널 콘솔은 CTRL-ALT-Fn
실제 터미널 장치이므로 고유한 /dev/tty[0-9]*
이름을 갖습니다.
그렇기 때문에 콘솔 2에 로그인한 후 tty
프롬프트에 입력하면 응답이 이지만 /dev/pts/0
콘솔 1에서 동일한 작업을 수행하면 출력은 입니다 /dev/tty1
. 어쨌든 콘솔 2로 돌아가서 다음을 수행합니다.
bash
PS1='$( { date ; fc -l -0 ; } >/dev/tty1 )'$PS1
뚜렷한 효과는 없습니다. 계속해서 더 많은 명령을 입력하고 CTRL-ALT-F1
다시 눌러 콘솔 1로 전환했습니다. 거기에서 <date_time>\n<hist#>\t<hist_cmd_string>
콘솔 2에 입력한 모든 명령에 대해 유사한 중복 항목을 발견했습니다 .
그러나 터미널 장치에 직접 쓰지 않는 한 다른 옵션은 다음과 같을 수 있습니다.
TGT_PTY=
mkfifo ${TGT_PTY:=/tmp/shell.history.pipe}
{ echo 'OPENED ON:'
date
} >${TGT_PTY}
그럼 아마...
less +F ${TGT_PTY}
대략적인 프롬프트 명령은 사양을 충족하지 않습니다. 형식 문자열도 없고 date
형식 옵션도 없습니다 fc
. 그러나 메커니즘에는 많은 것이 필요하지 않습니다. 프롬프트가 마지막 기록 명령을 렌더링할 때마다 현재 날짜와 시간이 ${TGT_PTY}
지정한 대로 기록됩니다. 문서. 그렇게 간단합니다.
쉘 기록 보기 및 인쇄가 fc
주요 목적입니다. 그렇지 않더라도 내장된 쉘입니다 date
. In은 zsh
fc
모든 종류의 멋진 서식 옵션을 제공하며 그 중 일부는 타임스탬프에 적합합니다. 물론 위에서 언급한 것처럼 bash
's'도 history
동일한 작업을 수행할 수 있습니다.
더 깔끔한 출력을 위해 더 잘 설명된 기술을 사용할 수 있습니다.여기프롬프트 순서 내의 하위 쉘에서 추적 및 처리되어야 하지만 현재 쉘에서 지속적 추적 변수를 설정합니다.
사양에 맞게 형식을 지정하는 이식 가능한 방법은 다음과 같습니다.
_HIST() { [ -z ${_LH#$1} ] ||
{ date "+${1}%t[%F %T]"
fc -nl -0
} >${TGT_PTY}
printf "(_LH=$1)-$1"
}
: "${_LH=0}"
PS1='${_LH##*[$(($(_HIST \!)))-9]}'$PS1
나는 구현했다마지막 역사카운터는 $_LH
최신 업데이트만 추적하므로 동일한 기록 명령을 두 번 작성하지 않습니다. 예를 들어 Enter 키를 누르는 경우에만 사용할 수 있습니다. 함수가 하위 쉘에서 호출되더라도 값을 유지하기 위해 현재 쉘에서 변수를 증가시키는 데 필요한 약간의 논쟁이 있습니다. 이는 다음에서 수행됩니다.협회.
출력은 다음과 같습니다.<hist#>\t[%F %T]\t<hist_cmd>\n
그러나 이것은 완전히 이식 가능한 버전일 뿐입니다. 이를 사용하면 bash
더 적은 리소스를 사용하고 쉘 내장 기능만 구현할 수 있습니다. 이는 누를 때마다 실행되는 명령이라고 생각하면 이상적일 수 있습니다 [ENTER]
. 여기에는 두 가지 방법이 있습니다.
_HIST() { [ -z ${_LH#$1} ] || {
printf "${1}\t[%(%F %T)T]"
fc -nl -0
} >${TGT_PTY}
printf "(_LH=$1)-$1"
}
PROMPT_COMMAND=': ${_LH=0};'$PROMPT_COMMAND
PS1='${_LH##*[$(($(_HIST \!)))-9]}'$PS1
또는 명령을 사용하여 bash
다음과 같이 history
함수를 정의 할 수 있습니다._HIST
_HIST() { [ -z ${_LH#$1} ] ||
HISTTIMEFORMAT="[%F %T]<tab>" \
history 1 >${TGT_PTY}
printf "(_LH=$1)-$1"
}
두 방법의 출력은 다음과 같습니다. <hist#>\t[%F %T]\t<hist_cmd>\n
이 history
방법에는 선행 공백이 포함되어 있습니다. 그러나 history
나는 타임스탬프를 얻기 위해 참조된 명령이 완료될 때까지 기다릴 필요가 없기 때문에 이 방법을 사용하면 타임스탬프가 더 정확할 것이라고 믿습니다 .
앞서 언급한 uniq
것처럼 어떤 방식으로든 스트림을 필터링하는 한 두 경우 모두 상태 추적을 피할 수 있습니다 .mkfifo
그러나 프롬프트에서 이렇게 하면 프롬프트 업데이트 작업에 의해 필요할 때만 항상 업데이트된다는 의미입니다. 이것은 매우 간단합니다.
tail
현재 하고 있는 것과 비슷한 작업을 수행할 수도 있지만
HISTFILE=${TGT_PTY}
답변3
형식을 자유롭게 사용해 보세요. 하지만 이것이 (내 생각에는) 원하는 대로 작동할 것입니다... 경로 어딘가에 저장하고 실행 가능하게 만들어서 즐기세요.
#!/bin/bash
count=$( echo "scale=0 ; $(cat ~/.bash_history | wc -l ) / 2" | bc -l )
tail -f ~/.bash_history | awk -v c=$count '{if($1 ~/^#/){gsub(/#/, "", $1);printf "%s\t", c; "date \"+%F %T\" --date @" $1 | getline stamp; printf "[%s]\t",stamp;c++}else{print $0}}'
나는 그것이 최적화될 수 있다고 확신하지만, 당신은 아이디어를 얻습니다.
빠른 참고 사항: ~/.bash_history는 개수를 추적하지 않으므로 먼저 항목 수를 결정합니다. 그런 다음 awk 매직을 사용하여 형식을 올바르게 지정하고 항목 수를 추적하세요.