Trước hết, lưu ý rằng lịch sử của bạn đã có trong một tệp. Nếu bạn đang chạy bash, tên của nó thường là ~/.bash_history
. Cụ thể hơn, đó là bất cứ điều gì bạn đã đặt biến HISTFILE
. Nếu bạn muốn sao chép nó sang tập tin khác, chỉ cần chạycat "$HISTFILE" > hist.txt
Bây giờ, về lý do tại sao history
lệnh không hoạt động trong tập lệnh bash shell, đó là vì tập lệnh được chạy trong trình bao con không tương tác của phiên shell hiện tại của bạn. Các shell con không kế thừa tất cả môi trường của cha mẹ (vì vậy không phải tất cả các biến đã đặt), chỉ các biến đã được xuất. Để minh họa, đoạn script dưới đây sẽ lặp lại giá trị của biến $var
:
#!/bin/bash
echo "$var"
Bây giờ, đặt $var
thành một cái gì đó và chạy tập lệnh:
$ var="foo"
$ foo.sh
VAR:
Tiếp theo, xuất biến đầu tiên:
$ var="foo"
$ export var
$ foo.sh
VAR: foo
Như bạn có thể thấy, khi biến đã được xuất, nó có sẵn cho các shell con.
Như tôi đã đề cập trước đó, lịch sử được lưu trữ trong tệp được chỉ ra bởi biến $HISTFILENAME
. Vì không được xuất theo mặc định, nên nó không được đặt khi chạy tập lệnh:
$ cat foo.sh
#!/bin/bash
echo "HISTFILE: $HISTFILE"
$ ./foo.sh
HISTFILE:
$ echo $HISTFILE
/home/terdon/.bash_history
Như bạn có thể thấy trong ví dụ trên, biến HISTFILE
được đặt trong phiên shell thông thường của tôi, nhưng trống khi chạy tập lệnh.
Vì vậy, để có được lịch sử, bạn có một vài lựa chọn:
HISTFILE
Giá trị mặc định là $HOME/.bash_history
. Nếu bạn không thay đổi điều đó, bạn chỉ cần chạy lệnh này trong tập lệnh của mình:
cat "$HOME/.bash_history" > history
Bạn có thể truyền $HISTFILE
biến cho tập lệnh của mình và cat
đó:
#!/bin/bash
cat "$1" > history
Lưu ở trên foo.sh
và chạy như thế này:
./foo.sh "$HISTORY"
Hãy chắc chắn rằng biến được xuất. Thêm dòng này vào ~/.bash_profile
tệp của bạn (nếu nó tồn tại) hoặc ~/.profile
(nếu ~/.bash_profile
không tồn tại):
export HISTFILE
Sau đó, đăng xuất và đăng nhập lại và bạn sẽ có thể chạy history > hist.txt
từ một tập lệnh như mong đợi. Điều này là do export VAR
có nghĩa là "cung cấp $ VAR cho vỏ con". Trong điều kiện thực tế, điều này có nghĩa là giá trị của HISTFILE
sẽ được kế thừa bởi trình bao không tương tác mà bạn sử dụng để chạy tập lệnh của mình.
Bây giờ, trong khi HISTFILE
sẽ được thiết lập, nó đã không được đọc bởi shell đang chạy tập lệnh. Vì vậy, để làm cho nó hoạt động, trước tiên bạn cần đọc nó history -r
. Toàn bộ kịch bản sẽ như thế này:
$!/bin/bash
history -r
history > hist.txt
Ngoài ra, chỉ cần xuất thủ công trước khi chạy tập lệnh:
$ export HISTFILE
Nhưng bạn vẫn sẽ cần history -r
trong kịch bản.
Bạn có thể source
làm như được đề xuất bởi câu trả lời của @ p0llard .