Cách tiêu chuẩn đơn giản nhất để in lệnh bash cuối cùng với dấu thời gian


8

Tôi muốn in lệnh bash cuối cùng với dấu thời gian của nó. history 1cho thấy lệnh lịch sử chính nó. Tôi cần sử dụng nó trên nhiều máy, vì vậy nó không nên phụ thuộc vào bất kỳ cấu hình tùy chỉnh nào. Chắc chắn phải có một số lệnh đơn giản mà tôi đang thiếu để làm điều này, như lastcmdhoặc một cái gì đó :)

Lưu ý rằng fc -l -1hiển thị lệnh cuối cùng nhưng không có dấu thời gian và quá phức tạp để gõ nó thường xuyên.

Để làm rõ, tôi đang tìm kiếm một số cách đơn giản và tiêu chuẩn để làm điều này bởi vì tôi cần sử dụng nó trên nhiều máy chủ và không thể tùy chỉnh tất cả chúng hoặc tạo các chức năng tùy chỉnh. Ngoài ra tôi cần phải gõ lệnh này bằng tay để nó thực sự đơn giản.

Có vẻ như HISTCONTROL = ignboth là cài đặt mặc định trên các máy chủ tôi cần truy cập để tôi có thể sử dụng:

 history 1 

(lệnh lịch sử có tiền tố là dấu cách) không đưa nó vào lịch sử, vì vậy nó hiển thị chính xác lệnh cuối cùng.

HISTTIMEFORMATmặc định không được đặt mặc định, vì vậy nó không phải là một giải pháp hoàn chỉnh. đó có phải là cách dễ hơn?


2
Bạn có nghĩa là dấu thời gian khi lệnh cuối cùng được chạy? Điều đó không được cứu bởi Bash. Đó là, tuy nhiên, được lưu bởi vỏ cá.
Andrea Lazzarotto

vâng, ngay cả dấu thời gian cũng đủ cho trường hợp sử dụng của tôi
mmm

bạn có thể vui lòng chỉ định cách hiển thị dấu thời gian này trong Fish không?
mmm

Tôi không biết chính xác một cách dễ dàng để làm điều đó trong Cá. Tôi chỉ viết rằng nó lưu thông tin đó. Tuy nhiên, hãy xem ở đây để biết kịch bản và yêu cầu tính năng: github.com/fish-shell/fish-shell/issues/677
Andrea Lazzarotto

Câu trả lời:


9

Như bạn chỉ ra, hãy tự history 1in historylệnh vì đó là lệnh cuối cùng bạn đã chạy. Để có được cái trước, bạn cần history 2:

$ touch foo
$ history 2
$ history 2
19950  touch foo
19951  history 2

Vì vậy, để có được lệnh trước mà không cần đếm historychính nó, hãy chuyển qua head -n1:

$ history 2 | head -n1
19952  touch foo

Sau đó, thêm dấu thời gian ở bất kỳ định dạng nào bạn muốn (xem man 3 strftimecác định dạng có sẵn):

$ HISTTIMEFORMAT="%F %H:%m:%S " history 2 | head -n1
19959  2016-06-11 15:06:08 touch foo

cảm ơn công việc này, nhưng tôi vẫn hy vọng có một cái gì đó đơn giản hơn :)
mmm

@mmm nó sẽ không đơn giản hơn nhiều history 2 | head -n1. Bạn luôn có thể đặt HISTTIMEFORMATbiến trong .profilehoặc .bashrcđể tránh đặt nó trong lệnh. Thậm chí đơn giản hơn, chỉ cần biến toàn bộ thành một bí danh.
terdon

Tôi đoán điều này chỉ hoạt động trong khi vỏ đang hoạt động, phải không? Có cách nào để cấu hình Bash để lưu trữ dấu thời gian với lịch sử không?
Andrea Lazzarotto

@AndreaLazzarotto nó đã làm, đó là lý do tại sao nó có thể in chúng khi được yêu cầu. Hãy nhìn vào~/.bash_history
terdon

2
@AndreaLazzarotto xin lỗi, nó chỉ được viết ~/.bash_historynếu HISTTIMEFORMATbiến được đặt. Hãy thử export HISTTIMEFORMAT="%F %H:%m:%S"; history -a; tail .bash_historyví dụ. Vì vậy, cài đặt HISTTIMEFORMATtoàn cầu (nói trong ~/.profile) sẽ đủ để điều này tự động xảy ra.
terdon

0

Một tùy chọn phi lịch sử có thể trợ giúp cũng là tùy chỉnh vỏ của bạn để hiển thị nó. Tôi có nó cho thấy điều đó và thông tin khác (thậm chí chi nhánh git!) Với:

HOST='\[\033[02;36m\]\h'; HOST=' '$HOST
TIME='\[\033[01;31m\]\t \[\033[01;32m\]'
LOCATION=' \[\033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \[\033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH

Nó không giúp ích gì cho lịch sử của tôi, nhưng khi tôi cuộn lại trong thiết bị đầu cuối của mình thì ít nhất tôi có thể thấy:

$ vi .bashrc
17:57:09 durrantm Castle2012 /home/durrantm 
$ pwd
/home/durrantm
17:57:10 durrantm Castle2012 /home/durrantm 
$ ls *.lt*
ls: cannot access *.lt*: No such file or directory
17:57:15 durrantm Castle2012 /home/durrantm 
$ ls *.rb*
1.rb  2.rb  3.rb  3_step_minimal_foundation_spec.rb  arrival.rb  r.rb  validate_controller.rb  x.rb*
17:57:19 durrantm Castle2012 /home/durrantm 
$ c
17:57:24 durrantm Castle2012 /home/durrantm/Dropbox/_/work/code 
$ which ruby
/home/durrantm/.rvm/rubies/ruby-2.1.2/bin/ruby
17:57:27 durrantm Castle2012 /home/durrantm/Dropbox/_/work/code 

0

Dường như bash không nằm ngoài hộp cung cấp bất kỳ cách đơn giản nào để lấy dấu thời gian khi lệnh cuối cùng được thực thi.

Trong trường hợp bạn có thể tùy chỉnh các cấu hình bash máy chủ của mình, bạn có thể tạo chức năng bash tùy chỉnh dựa trên câu trả lời từ @terdon.


0

Hành hình

export HISTTIMEFORMAT='%F %T '

và tệp lịch sử của bạn sẽ ghi lại thời gian (chỉ cho các lệnh mới):

$ history 5

99576  2016-06-13 02:26:25 export HISTTIMEFORMAT='%F %T '
99580  2016-06-13 02:26:45 bash -c 'IFS=:$IFS ; set -- a b c ; echo "$@ "'
99581  2016-06-13 02:27:37 dash -c 'set a b c; IFS=; echo $*'
99582  2016-06-13 02:28:25 fc -l -1
99607  2016-06-13 02:28:25 history 5

sử dụng một khoảng trắng trước lệnh để tránh nó được ghi lại trong lịch sử:

$  history 1
99607  2016-06-13 02:28:25 history 5

Sau đó, để làm cho nó đơn giản hơn, hãy tạo một bí danh:

$ alias h='history 1'

Sau đó sử dụng nó với một khoảng trắng sau khi HISTTIMEFORMATđã được đặt thành get:

$  h                ### Understand that there is an space in front of the command.
99607  2016-06-13 02:28:25 history 5
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.