다른 쉘의 기록을 볼 수 있습니까?

다른 쉘의 기록을 볼 수 있습니까?

bash중단하거나 일시적으로 일시 중지하고 싶지 않은 창에서 무언가를 실행하고 있습니다 . 특정 창 세션에 대한 명령 기록을 볼 수 있습니까? 여러 개의 창이 열려 있으므로 살펴보는 것이 .bash_history별로 도움이 되지 않습니다.

답변1

사용 방법은 다음과 같습니다 gdb(관리자 권한으로 실행해야 함).https://stackoverflow.com/questions/7272558/can-we-define-a-new-data-type-in​​-a-gdb-session:

준비하다:

echo 'typedef void * histdata_t;
typedef struct _hist_entry {
  char *line;
  char *timestamp;
  histdata_t data;
} HIST_ENTRY;
typedef struct _hist_state {
  HIST_ENTRY **entries;
  int offset;
  int length;
  int size;
  int flags;
} HISTORY_STATE;
HIST_ENTRY _sampleentry;
HISTORY_STATE _samplestate;
' | tee sample.c
# get sample.o
gcc -g -c sample.c

# get bash pid, maybe via `pgrep bash`, or `pidof bash`, etc
# say in this example, it is 16573

테스트 명령 실행:

$ sudo gdb -p 16573 -ex "set confirm off" -ex "add-symbol-file sample.o 0" -ex 'printf "ptype HIST_ENTRY\n"' -ex "ptype HIST_ENTRY" -ex 'printf "p *(HISTORY_STATE*)history_get_history_state()\n"' -ex 'p *(HISTORY_STATE*)history_get_history_state()' -ex 'set $myoffs = (*(HISTORY_STATE*)history_get_history_state())->offset' -ex 'printf "myoffs %d\n", $myoffs' -ex 'printf "p *(HIST_ENTRY *)history_get($myoffs)\n"' -ex 'p *(HIST_ENTRY *)history_get($myoffs)'
....
0x00007fb053abb0e9 in __pselect (nfds=1, readfds=0x7ffe81a009b0, writefds=0x0, exceptfds=0x0, 
    timeout=<optimized out>, sigmask=0x7ffe81a00930) at ../sysdeps/unix/sysv/linux/pselect.c:69
69  ../sysdeps/unix/sysv/linux/pselect.c: No such file or directory.
add symbol table from file "sample.o" at
    .text_addr = 0x0
Reading symbols from sample.o...done.
ptype HIST_ENTRY
type = struct _hist_entry {
    char *line;
    char *timestamp;
    histdata_t data;
}
p *(HISTORY_STATE*)history_get_history_state()
$1 = {entries = 0x55ed117f4ab0, offset = 155, length = 155, size = 502, flags = 1}
myoffs 155
p *(HIST_ENTRY *)history_get($myoffs)
$2 = {line = 0x55ed119684d0 "kill -STOP $$", timestamp = 0x55ed119709a0 "#1545016332", data = 0x0}

gdb "마지막 기록 항목 캡처" 명령을 준비합니다.

echo '
set verbose off
set complaints 0
set trace-commands off
add-symbol-file sample.o 0
set $myoffs = ((HISTORY_STATE*)history_get_history_state())->offset
set $line = ((HIST_ENTRY *)history_get($myoffs))->line
printf "%s\n", $line
' | tee gdbscript

gdb "마지막 기록 항목 캡처" 명령을 실행합니다.

sudo gdb -p 16573 -batch -x gdbscript 2>/dev/null | tail -1
kill -STOP $$

답변2

아니요, bash지원되지 않습니다. 기록은 메모리에 보관되며 이를 사용하거나 동일한 세션에 저장할 때만 .bash_history다른 프로세스에서 사용할 수 있습니다 . 그러나 일단 파일 시스템에 기록되면 명령이 시작된 세션에 대한 정보가 손실됩니다.history -ahistory -w

가장 가까운 방법은 실행 후 직접 각 명령을 .bashrc추가하기 위해 몇 줄을 사용하는 것입니다.bashhttps://unix.stackexchange.com/a/1292/147970
그러면 할 수 있습니다 .bash_history.

특정 세션의 기록에 액세스하려면 Ctrl+Z다음을 사용하여 해당 세션의 포그라운드 프로세스를 중단해야 합니다.

답변3

Ctrl-Z를 눌러 작업을 백그라운드에 놓을 수 있습니다. 그런 다음 셸에서 작업하고 명령 기록을 볼 수 있습니다. 백그라운드에서 작업을 보려면 job명령을 사용할 수 있습니다. 작업으로 돌아가려면 fg명령을 실행합니다.

관련 정보