Saya menggunakan alias sederhana untuk mengaktifkan "pelacakan" perintah di satu atau banyak jendela terminal:
alias trackmi='export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"'
Lalu saya hanya file .bash_historytail -f
saya di terminal lain di ruang kerja untuk mendapatkan umpan balik segera. Saya baru saja mengaktifkan riwayat tidak terbatas dan memperbarui format riwayat saya ( ) di .bashrc . Tentu saja perintah menampilkan cap waktu. Tetapi format file histori per se adalah:export HISTTIMEFORMAT="[%F %T] "
history
#1401234303
alias
#1401234486
cat ../.bashrc
Bagaimana saya dapat mengubah waktu Unix dan seluruh perintah ditampilkan pada satu baris seperti halnya history
perintah, termasuk penomoran:
578 [2014-05-27 19:45:03] alias
579 [2014-05-27 19:48:06] cat ../.bashrc
... dan ikuti itu. Atau menemukan cara untuk terus menampilkan output dari history
perintah ke terminal?
bash
text-processing
command-history
date
Komunitas
sumber
sumber
fn+1
membandingkan! Terima kasih!Inilah produk akhir yang bekerja pada xterm layar terbagi dari dasarnya shell untuk bekerja hanya dalam beberapa perintah:
Cara yang lebih kasar untuk melakukan ini daripada yang ditunjukkan dalam tangkapan layar mungkin terlihat seperti ini:
Di mana
${TGT_PTY}
akan menjadi apa pun yang Anda dapatkan daritty
perintah ketika benar-benar menjalankan shell interaktif di layar di mana Anda ingin output Anda. Atau, sungguh, Anda bisa menggunakan file yang dapat ditulis sama sekali karena pada dasarnya hanya target untuk pengalihan file.Saya menggunakan sintaks pty untuk pseudo-terminal karena saya menganggap itu adalah xterm dari beberapa jenis, tetapi Anda mungkin dengan mudah mendedikasikan vt - dan sejarah streaming Anda selalu hanya merupakan
CTRL-ALT-Fn
kombo kunci. Jika itu aku, aku mungkin menggabungkan dua gagasan dan membuatnya menjadiscreen
atautmux
sesi pada vt khusus ... Tapi aku ngelantur.Pada mesin yang baru saja boot saya disambut dengan
/bin/login
prompt khas padagetty
konsol Linux yang khas . Saya menekanCTRL-ALT-F2
untuk mengakseskmscon
konsol yang kurang umum yang berperilaku lebih sepertixterm
atty
. Saya memasukkan perintahtty
dan menerima sebagai tanggapan/dev/pts/0
.Umumnya xterms multipleks perangkat terminal tunggal menjadi banyak menggunakan pseudo-terminal - jadi jika Anda melakukan hal serupa di X11 dengan beralih di antara tab terminal atau windows Anda kemungkinan akan menerima output
/dev/pts/[0-9]*
juga. Tetapi konsol terminal virtual yang diakses denganCTRL-ALT-Fn
kombinasi kunci adalah perangkat terminal yang benar (er) dan karenanya menerima/dev/tty[0-9]*
peruntukannya sendiri .Inilah sebabnya mengapa setelah masuk ke konsol 2 ketika saya mengetik
tty
di prompt jawabannya adalah/dev/pts/0
tetapi ketika saya melakukan hal yang sama pada konsol 1 hasilnya/dev/tty1
. Bagaimanapun, kembali pada konsol 2 saya kemudian lakukan:Tidak ada efek yang terlihat. Saya terus mengetik beberapa perintah lagi dan kemudian saya beralih ke konsol 1 dengan menekan
CTRL-ALT-F1
lagi. Dan di sana saya menemukan entri berulang yang terlihat seperti<date_time>\n<hist#>\t<hist_cmd_string>
untuk setiap perintah yang saya ketikkan pada konsol 2.Pembatasan langsung menulis ke perangkat terminal, opsi lain dapat terlihat seperti:
Dan mungkin ...
Perintah prompt kasar tidak memenuhi spesifikasi Anda - tidak ada string format untuk
date
dan tidak ada opsi formatfc
baik - tetapi mekanismenya tidak memerlukan banyak: setiap kali prompt Anda membuat perintah riwayat terakhir dan tanggal dan waktu saat ini ditulis untuk yang${TGT_PTY}
file yang Anda tentukan. Sesederhana itu.Menonton dan mencetak riwayat shell adalah
fc
tujuan utama. Ini adalah built-in shell, meskipundate
tidak. Dizsh
fc
dapat memberikan semua jenis opsi pemformatan mewah, beberapa di antaranya berlaku untuk cap waktu. Dan tentu saja, seperti yang Anda perhatikan di atas,bash
'shistory
dapat melakukan hal yang sama.Untuk kepentingan output yang lebih bersih, Anda dapat menggunakan teknik yang saya jelaskan lebih baik di sini untuk mengatur variabel pelacakan persisten di shell saat ini meskipun harus melacak dan memprosesnya dalam subkulit dalam urutan cepat.
Berikut cara portabel memformat dengan spesifikasi Anda:
Saya menerapkan penghitung last_history
$_LH
yang hanya melacak pembaruan terbaru sehingga Anda tidak menulis perintah sejarah yang sama dua kali - misalnya hanya untuk menekan enter. Ada sedikit perselisihan yang diperlukan untuk mendapatkan variabel yang bertambah dalam shell saat ini sehingga tetap mempertahankan nilainya meskipun fungsinya disebut dalam subkulit - yang, sekali lagi, lebih baik dijelaskan dalam tautan .Outputnya seperti
<hist#>\t[%F %T]\t<hist_cmd>\n
Tapi itu hanya versi yang sepenuhnya portabel. Dengan
bash
itu dapat dilakukan dengan lebih sedikit dan dengan menerapkan shell builtins saja - yang mungkin diinginkan ketika Anda menganggap bahwa ini adalah perintah yang akan berjalan setiap kali Anda menekan[ENTER]
. Berikut ini dua cara:Atau, menggunakan
bash
'shistory
perintah, Anda dapat menentukan_HIST
fungsi dengan cara ini:Output untuk kedua metode juga terlihat seperti:
<hist#>\t[%F %T]\t<hist_cmd>\n
meskipunhistory
metode ini menyertakan beberapa spasi putih terkemuka. Namun, saya percayahistory
cap waktu metode akan lebih akurat karena saya pikir mereka tidak perlu menunggu perintah yang dirujuk untuk menyelesaikan sebelum mendapatkan cap mereka.Anda dapat menghindari pelacakan keadaan apa pun dalam kedua kasus jika hanya Anda yang entah bagaimana menyaring aliran
uniq
- seperti yang mungkin Anda lakukan dengan yangmkfifo
saya sebutkan sebelumnya.Tetapi melakukannya di prompt seperti ini berarti selalu diperbarui hanya jika perlu hanya dengan tindakan memperbarui prompt. Itu mudah.
Anda mungkin juga melakukan sesuatu yang mirip dengan apa yang Anda lakukan
tail
tetapi lebih pada pengaturansumber
${TGT_PTY}
dan semuanya? Jika demikian, itu akan menjelaskan 'pengarahan ambigu' karena itu akan menjadi variabel kosong. Anda membutuhkan file./dev/pts/[num]
dalam semua kemungkinan -cat
saya paranoid. Ini berfungsi dengan baik - bahkan 12 jam kemudian.Jangan ragu untuk bermain dengan pemformatan, tetapi ini (saya percaya) melakukan apa yang Anda minta ... simpan ke suatu tempat di PATH Anda, jadikan dieksekusi dan nikmati:
Saya yakin itu bisa dioptimalkan, tetapi Anda mendapatkan idenya.
Penjelasan singkat: karena ~ / .bash_history tidak melacak hitungan, pertama-tama kita menentukan jumlah entri. Kemudian sedikit sihir awk untuk mendapatkan pemformatan yang benar, dan melacak jumlah entri.
sumber
tail -f
akan membaca 10 baris awalnya yang sudah termasuk dalam Andacount
. Ini mengasumsikan tanggal GNU dalam lingkungan non-POSIX (POSIXLY_CORRECT tidak disetel). Ini menjalankan satu shell dan satu perintah tanggal per cap waktu.count
menghitung separuh baris.bash_history
, dan kemudian peningkatan untuk setiap baris yang tidak dimulai#
, sehingga penghitungan riwayat yang dilaporkan cenderung salah. Menggunakancount=$(grep -c '^#' ...)
mungkin akan lebih baik, tetapi dalam hal apa pun, angka-angka sejarah itu cenderung berakhir tidak sinkron terutama jika Anda memiliki lebih dari 2 bash berjalan pada saat yang sama.history
memanfaatkan perintah.