ใส่ข้อความในบัฟเฟอร์บรรทัดคำสั่ง bash


9

ฉันต้องการใส่ข้อความบางส่วนลงในบัฟเฟอร์บรรทัดคำสั่งของ bash โดยทางโปรแกรมเพื่ออ่านและแก้ไขและใช้เป็นคำสั่ง

สิ่งที่ฉันรอคอยเป็นสิ่งที่คล้ายกับread -iแต่สำหรับคำสั่ง

-i text หากกำลังใช้ readline เพื่ออ่านบรรทัดข้อความจะถูกวางในบัฟเฟอร์การแก้ไขก่อนที่จะเริ่มการแก้ไข

แก้ไข : ด้วยโปรแกรมฉันหมายความว่าต้องการเขียนสิ่งนี้ในสคริปต์เปิดใช้งานสคริปต์และเตรียมบัฟเฟอร์คำสั่งหรือแก้ไขประวัติคำสั่ง (ตามที่มีคำถามที่แนะนำ)


IIRC screenสามารถทำสิ่งนี้ให้คุณได้
strugee

คำตอบ:


6

ผมพบว่าวิธี hacky การทำเช่นนี้ในหน้าตัวอย่าง fzf ใช้งานได้กับ bash 4.3 และ perl 5.18:

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

# Example usage
echo 'my test cmd' | writecmd

มันพิมพ์คำสั่งไปยัง stdout แต่คัดลอกไปยังบัฟเฟอร์คำสั่งเช่นกัน นอกจากนี้ยังมีตัวอย่างในหน้าเชื่อมโยงหากคุณต้องการรันคำสั่งโดยตรง


คำตอบนี้ใกล้เคียงกับสิ่งที่ OP ร้องขอ
reza.safiyat

ไวยากรณ์แตกต่างกันเล็กน้อยในคำตอบนี้ , &TIOCSTIเป็นดีกว่าเล็กน้อยกว่า0x5412มากเกินไป ไม่เป็นไรดูเหมือนว่าบางแพลตฟอร์ม (เช่นOpenBSD ) จะปิดใช้งาน TIOCSTI ฉันคิดว่านั่นหมายถึงทั้งแนวทางนี้และของ zsh print -zไม่ได้ผล
dimo414

4

หากนี่เป็นฟังก์ชั่นที่คุณจะใช้ในการโยง readline ด้วยbind -xคุณสามารถแก้ไขREADLINE_LINEได้ ( ตัวอย่าง )

ด้านนอกของ ReadLine history -sผูกพันคุณสามารถผลักดันคำสั่งปลอมบนประวัติศาสตร์ด้วย


ปัญหาคือว่าถ้าฉันทำhistory -s 'foo'ในสคริปต์ประวัติของเปลือกที่เปิดตัวจะไม่ได้รับการแก้ไขเลย
gioele

@gioele คุณต้องเปิดจากภายในเชลล์ (เช่นจากสคริปต์ที่คุณโหลดด้วยsource) คุณไม่สามารถทำอะไรจากกระบวนการแยกต่างหาก
Gilles 'หยุดชั่วร้าย'

2

คำตอบของ Gilles นั้นถูกต้อง แต่ไม่พอใจอย่างสมบูรณ์ เมื่อฉันอ่านคำถามนี้ OP ต้องการ "preseed" บรรทัดอินพุตถัดไป ในกรณีของฉันฉันต้องการอ่านตำแหน่งปัจจุบันของเทอร์มินัลในฟังก์ชัน PROMPT_COMMAND ของฉัน ใช้งานได้ แต่ใช้บัฟเฟอร์การอ่านเดียวกันกับเชลล์หลักดังนั้นผู้ใช้อินพุตใด ๆ จึงถูกทิ้งเนื่องจากความจริงที่ว่าฉันได้ทำการเรียก builtin ในฟังก์ชั่น ดังนั้นฉันต้องการอ่านอินพุตของผู้ใช้แยกกันทำเทอร์มินัลของฉันอ่านแล้วใส่อินพุตอ่านกลับเข้าไปในบัฟเฟอร์อินพุตซึ่งเป็นคำถามเดิม โปรดทราบว่านี่เป็นกระบวนการที่แน่นอนดังนั้นจึงควรเป็นไปได้ในทางทฤษฎี

เท่าที่ฉันเห็น (บน bash 4.2) ไม่มีฟังก์ชั่นที่จะผลักบางสิ่งบางอย่างไปยังอินพุตสแต็กโดยทางโปรแกรม ใน zsh มีการใช้ 'print -z'

ดังนั้นคำตอบคือ: ไม่สามารถทุบตีได้คุณจำเป็นต้องใช้ zsh สำหรับสิ่งนี้


0

เป็นทางเลือกhistory -s 'foo'ลอง:

echo 'foo' >> ~/.bash_history
history -n

# or
history -s 'foo'
history -a
history -n
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.