ฉันจะบันทึกคำสั่งสุดท้ายไปยังไฟล์ได้อย่างไร?


29

เมื่อฉันใช้การวิเคราะห์โดยใช้ bash shell ฉันมักจะต้องการบันทึกคำสั่งที่ฉันใช้ซึ่งให้ผลลัพธ์ที่ดีกับไฟล์ในไดเรกทอรีเดียวกัน ("LOGBOOK" ของฉันซึ่งเรียกว่า) เพื่อให้ฉันสามารถตรวจสอบสิ่งที่ ฉันได้รับผลลัพธ์เหล่านั้น จนถึงตอนนี้มีความหมายว่าฉันทั้ง copy.pasting คำสั่งจาก terminal หรือกด "up" การปรับเปลี่ยนคำสั่งเป็นecho"my command" >> LOGBOOKหรือการแสดงตลกที่คล้ายกันอื่น ๆ

ผมพบว่ามีhistoryเครื่องมือในวันอื่น ๆ getlast >> LOGBOOKแต่ฉันไม่สามารถหาวิธีการใช้มันเพื่อให้ได้คำสั่งดำเนินการก่อนหน้านี้เพื่อที่ฉันสามารถทำสิ่งที่ต้องการ

มีวิธีง่าย ๆ ที่ดีในการทำเช่นนี้ หรือมิฉะนั้นคนอื่น ๆ จะจัดการกับการบันทึกคำสั่งสำหรับผลลัพธ์ที่ได้อย่างไร

คำตอบ:


37

หากคุณกำลังใช้bashคุณสามารถใช้fcคำสั่งเพื่อแสดงประวัติของคุณในแบบที่คุณต้องการ:

fc -ln -1

ที่จะพิมพ์คำสั่งสุดท้ายของคุณ -lหมายถึงรายการ-nหมายถึงไม่ให้ใส่คำนำหน้าบรรทัดที่มีหมายเลขคำสั่งและ-1บอกให้แสดงเฉพาะคำสั่งสุดท้าย หากช่องว่างในช่วงเริ่มต้นของเส้น (เฉพาะบรรทัดแรกในคำสั่งหลายคู่สาย) sedเป็นที่น่ารำคาญคุณสามารถกำจัดได้อย่างง่ายดายพอกับ ทำให้เป็นฟังก์ชันเชลล์และคุณมีวิธีแก้ปัญหาตามที่ร้องขอ ( getlast >> LOGBOOK):

getlast() {
    fc -ln "$1" "$1" | sed '1s/^[[:space:]]*//'
}

สิ่งนี้ควรทำงานตามที่คุณถามในคำถามของคุณ

ฉันได้เพิ่มการเปลี่ยนแปลงเล็กน้อยโดยการเพิ่ม"$1" "$1"กับfcคำสั่ง สิ่งนี้จะช่วยให้คุณสามารถพูดได้เช่นgetlast mycommandพิมพ์บรรทัดคำสั่งสุดท้ายที่เรียกใช้mycommandดังนั้นหากคุณลืมที่จะบันทึกก่อนที่จะเรียกใช้คำสั่งอื่นคุณยังสามารถบันทึกอินสแตนซ์สุดท้ายของคำสั่งได้อย่างง่ายดาย ถ้าคุณไม่ผ่านการโต้แย้งไปgetlast(เช่นเรียกใช้fcเป็นfc -ln "" ""จะพิมพ์ออกมาเพียงคำสั่งสุดท้ายเท่านั้น)

[หมายเหตุ: ตอบแก้ไขเพื่อรับฟังความคิดเห็นของ @ Bram และปัญหาที่กล่าวถึงในคำตอบของ @glenn jackman]


5
รูปแบบแรกสามารถย่อfc -lnr | head -n 1 fc -lnr -1
Bram

@Bram: สิ่งที่ดี ฉันใช้help fcเอกสารของฉัน หน้าคนทุบตีมีรายละเอียดเพิ่มเติมรวมถึงการใช้ดัชนีเชิงลบนี้ การกำจัดheadเป็นสิ่งที่ดีเพราะคำสั่งเดียวที่เหลืออยู่ในตัวดังนั้นตอนนี้จึงไม่มีทางแยก / ผู้บริหาร
camh

1
ฉันสงสัยว่าเหตุใดคำสั่งจึงถูกเรียกว่าfc...
imz - Ivan Zakharyaschev

2
มันหมายถึง "คำสั่งแก้ไข" gnu.org/software/bash/manual/bashref.html#Bash-History-Builtins
มิเคล

9

ปัญหาหนึ่งที่มีคำตอบของ @ camh คือถ้าคุณมีคำสั่งที่ครอบคลุมหลายบรรทัดมันจะแสดงเฉพาะบรรทัดแรกเท่านั้น:

$ echo "one
> two
> three"
one
two
three

$ fc -lnr | head -1
         echo "one

ลองสิ่งนี้:

$ alias getlast='fc -nl $((HISTCMD - 1))'

$ echo "one
> two
> three"
one
two
three

$ getlast
         echo "one
two
three"

3
การเปิดใช้cmdhistจะแก้ไขได้ว่า: "ถ้าตั้งค่า bash จะพยายามบันทึกทุกบรรทัดของคำสั่งหลายบรรทัดในรายการประวัติเดียวกันซึ่งจะช่วยให้แก้ไขคำสั่งหลายบรรทัดได้อย่างง่ายดาย"
Mark McKinstry

2

แทนที่จะใช้ลูกศรขึ้นคุณสามารถใช้"!!"เพื่ออ้างถึงคำสั่งก่อนหน้า

เช่น

$ some -long --command --difficulty="very hard to remember"
$ echo "!!" >> LOGBOOK

หมายเหตุ: นี่ไม่ได้อ้างอิงข้อความตามตัวอักษร


5
ที่จะไม่จับคำสั่งที่แท้จริง หากมีตัวบ่งชี้เชลล์ใด ๆ พวกเขาจะได้รับการประเมินและทดแทน ท่อยังจะทำลาย: ls | less-> ->echo !! >> LOGBOOK echo ls | less >> LOGBOOK
camh

0

คุณสามารถทำได้ด้วยคำสั่งต่อไปนี้หากคุณใช้ bash shell:

$> history -a LOGBOOK

สิ่งนี้จะผนวกคำสั่งทั้งหมดของคุณจากเซสชันปัจจุบันไปยังไฟล์นั้นคุณยังสามารถเพิ่มนามแฝงในไฟล์ ~ / .bashrc ของคุณเพื่อทำสิ่งนี้ด้วยคำสั่งเดียว:

$> alias getlast="history -a LOGBOOK"

1
แต่คุณไม่มีข้อกำหนดที่สำคัญกว่านั้นที่ฉันบันทึกเฉพาะคำสั่งที่ใช้งานได้และได้ผลลัพธ์ที่ฉันมี ฉันไม่ต้องการที่จะบันทึกคำสั่งล่าสุดทั้งหมดที่ฉันได้ทำเพียงแค่เลือกคำสั่งหลังจากที่ฉันใช้พวกเขา ขอบคุณอยู่ดี
MattLBeck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.