ก่อนอื่นโปรดทราบว่าประวัติของคุณอยู่ในไฟล์แล้ว ~/.bash_history
หากคุณกำลังใช้ทุบตีชื่อของมันมักจะ โดยเฉพาะอย่างยิ่งมันเป็นสิ่งที่คุณได้ตั้งค่าตัวแปรHISTFILE
ที่จะ หากคุณต้องการคัดลอกไปยังไฟล์อื่นเพียงแค่เรียกใช้cat "$HISTFILE" > hist.txt
ตอนนี้สาเหตุที่history
คำสั่งไม่ทำงานในสคริปต์ทุบตีเปลือกหอยนั่นเป็นเพราะสคริปต์ถูกเรียกใช้ในเชลล์ลูกที่ไม่ใช่แบบโต้ตอบของเซสชันเชลล์ปัจจุบันของคุณ Child shells ไม่สืบทอดสภาพแวดล้อมของพาเรนต์ทั้งหมด (ดังนั้นจึงไม่ใช่ตัวแปร set ทั้งหมด) เฉพาะตัวแปรที่ถูกเอ็กซ์พอร์ต เพื่อแสดงสคริปต์ด้านล่างจะสะท้อนค่าของตัวแปร$var
:
#!/bin/bash
echo "$var"
ตอนนี้ตั้งค่า$var
บางอย่างและเรียกใช้สคริปต์:
$ var="foo"
$ foo.sh
VAR:
ถัดไปส่งออกตัวแปรก่อน:
$ var="foo"
$ export var
$ foo.sh
VAR: foo
อย่างที่คุณเห็นเมื่อตัวแปรถูกส่งออกมันจะพร้อมใช้งานสำหรับเปลือกลูก
$HISTFILENAME
ที่ผมกล่าวถึงก่อนประวัติศาสตร์จะถูกเก็บไว้ในแฟ้มที่ชี้ไปตามตัวแปร เนื่องจากไม่ได้ถูกส่งออกโดยค่าเริ่มต้นจึงไม่ได้ตั้งค่าเมื่อเรียกใช้สคริปต์:
$ cat foo.sh
#!/bin/bash
echo "HISTFILE: $HISTFILE"
$ ./foo.sh
HISTFILE:
$ echo $HISTFILE
/home/terdon/.bash_history
ดังที่คุณเห็นในตัวอย่างด้านบนตัวแปรHISTFILE
ถูกตั้งค่าในเซสชันเชลล์ปกติของฉัน แต่จะว่างเปล่าเมื่อเรียกใช้สคริปต์
ดังนั้นเพื่อให้ได้มาซึ่งประวัติคุณมีทางเลือกไม่กี่อย่าง:
ที่เริ่มต้นค่าHISTFILE
$HOME/.bash_history
หากคุณยังไม่ได้เปลี่ยนคุณสามารถเรียกใช้คำสั่งนี้ในสคริปต์ของคุณ:
cat "$HOME/.bash_history" > history
คุณสามารถส่ง$HISTFILE
ตัวแปรไปยังสคริปต์ของคุณและcat
:
#!/bin/bash
cat "$1" > history
บันทึกข้างต้นเป็นfoo.sh
และเรียกใช้ดังนี้:
./foo.sh "$HISTORY"
ตรวจสอบให้แน่ใจว่าตัวแปรถูกส่งออก เพิ่มบรรทัดนี้ในไฟล์~/.bash_profile
(ถ้ามี) หรือ~/.profile
(หาก~/.bash_profile
ไม่มี):
export HISTFILE
จากนั้นออกจากระบบและเข้าสู่ระบบอีกครั้งและคุณควรจะสามารถเรียกใช้history > hist.txt
จากสคริปต์ตามที่คาดไว้ นี่เป็นเพราะexport VAR
หมายถึง "ทำให้ $ VAR พร้อมใช้งานสำหรับเชลล์ลูก" ในแง่การปฏิบัตินี่หมายความว่าคุณค่าของHISTFILE
จะได้รับการสืบทอดโดยเชลล์ที่ไม่โต้ตอบซึ่งคุณใช้เพื่อเรียกใช้สคริปต์
ตอนนี้ในขณะที่HISTFILE
จะถูกตั้งค่ามันจะไม่ถูกอ่านโดยเชลล์ที่รันสคริปต์ ดังนั้นเพื่อให้มันใช้งานได้คุณต้องอ่านมันhistory -r
ก่อน สคริปต์ทั้งหมดจะมีลักษณะเช่นนี้:
$!/bin/bash
history -r
history > hist.txt
หรือเพียงแค่เอ็กซ์พอร์ตด้วยตนเองก่อนรันสคริปต์:
$ export HISTFILE
แต่คุณจะต้องhistory -r
ใช้สคริปต์
คุณสามารถsource
ตามคำแนะนำของ@ p0llardได้