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 historylệ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 $varthà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:
HISTFILEGiá 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 $HISTFILEbiến cho tập lệnh của mình và catđó:
#!/bin/bash
cat "$1" > history
Lưu ở trên foo.shvà 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_profiletệp của bạn (nếu nó tồn tại) hoặc ~/.profile(nếu ~/.bash_profilekhô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.txttừ một tập lệnh như mong đợi. Điều này là do export VARcó 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 HISTFILEsẽ đượ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 HISTFILEsẽ đượ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 -rtrong kịch bản.
Bạn có thể sourcelàm như được đề xuất bởi câu trả lời của @ p0llard .