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 -a
history -w
最も近い方法は、実行後に各コマンドを直接.bashrc
追加するために数行を使用することです。bash
https://unix.stackexchange.com/a/1292/147970
そうすることができます.bash_history
。
特定のセッションの履歴にアクセスするには、Ctrl+Z
次を使用してそのセッションのフォアグラウンドプロセスを中断する必要があります。
答え3
Ctrl-Z を押してタスクをバックグラウンドにドロップできます。その後、シェルで作業し、コマンド履歴を表示できます。バックグラウンドでタスクを表示するには、job
コマンドを使用できます。ジョブに戻るには、fg
コマンドを実行します。