TL; DR: alias @@='$($(fc -ln -1) |& tail -1)'
สิ่งอำนวยความสะดวกการโต้ตอบประวัติของ Bash ไม่มีกลไกใด ๆ ในการตรวจสอบผลลัพธ์ของคำสั่ง เชลล์ไม่ได้เก็บสิ่งนั้นไว้และการขยายประวัตินั้นใช้สำหรับคำสั่งที่คุณใช้หรือบางส่วนของคำสั่งเหล่านั้น
สิ่งนี้จะทำให้วิธีการเรียกใช้คำสั่งล่าสุดอีกครั้งและไพพ์ทั้งstdoutและstderr ( |&
) เป็นการทดแทนคำสั่ง คำตอบของ heemayl ทำสิ่งนี้ได้ แต่ไม่สามารถใช้ในนามแฝงได้เนื่องจากเชลล์ทำการขยายประวัติก่อนที่จะขยายนามแฝงไม่ใช่หลังจากนั้น
set -H
ฉันไม่สามารถได้รับการขยายตัวของประวัติศาสตร์ที่จะทำงานในฟังก์ชั่นเปลือกอย่างใดอย่างหนึ่งได้โดยการเปิดใช้งานในฟังก์ชั่นที่มี ฉันสงสัยว่า!!
ในฟังก์ชั่นจะไม่ขยายและฉันไม่แน่ใจว่ามันจะขยายไปถ้ามันเป็น แต่ตอนนี้ฉันไม่แน่ใจว่าทำไมมันไม่ได้
ดังนั้นหากคุณต้องการตั้งค่าเพื่อให้คุณสามารถพิมพ์ได้น้อยมากคุณควรใช้fc
shell builtinแทนการขยายประวัติเพื่อแยกคำสั่งสุดท้ายจากประวัติ นี่เป็นข้อได้เปรียบเพิ่มเติมที่ใช้งานได้แม้ว่าจะปิดใช้งานการขยายประวัติก็ตาม
ดังแสดงในกอร์ดอน Davisson 's คำตอบที่จะสร้างนามแฝงที่มีการขยายตัวประวัติทุบตี (ในSuper User ) จำลอง$(fc -ln -1)
!!
เสียบนี้!!
ในคำสั่ง heemayl ของ $(!! |& tail -1)
อัตราผลตอบแทน:
$($(fc -ln -1) |& tail -1)
สิ่งนี้ใช้งานได้เหมือน$(!! |& tail -1)
แต่สามารถอยู่ในนิยามของนามแฝง:
alias @@='$($(fc -ln -1) |& tail -1)'
หลังจากที่คุณเรียกใช้คำจำกัดความนั้นหรือใส่ไว้ใน.bash_aliases
หรือ.bashrc
และเริ่มเชลล์ใหม่คุณสามารถพิมพ์@@
(หรืออะไรก็ตามที่คุณตั้งชื่อนามแฝง) เพื่อพยายามรันบรรทัดสุดท้ายของเอาต์พุตจากคำสั่งสุดท้าย
ek@Io:~$ alias @@='$($(fc -ln -1) |& tail -1)'
ek@Io:~$ evolution
The program 'evolution' is currently not installed. You can install it by typing:
sudo apt-get install evolution
ek@Io:~$ @@
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
evolution-common evolution-data-server evolution-data-server-online-accounts
....