วิธีที่ง่ายที่สุดในการดำเนินการข้อความจากหางที่บรรทัดคำสั่งคืออะไร?


10

บางครั้งฉันกำลังทำงานกับกล่องใหม่ (อูบุนตู) และฉันพิมพ์gitและได้รับการแจ้งเตือน:

The program 'git' is currently not installed.  You can install it by typing:
apt-get install git-core

หากเกิดขึ้นฉันรู้ว่าฉันสามารถคว้าบรรทัดสุดท้ายโดยทำสิ่งที่ชอบ:

!! 2>&1 | tail -n 1

แต่ฉันจะรันผลลัพธ์ของ (นั้นapt-get install git-core) ได้อย่างง่ายดายที่สุดได้อย่างไร

ฉันรู้ว่าฉันสามารถทำได้

`!! 2>&1 | tail -n 1`

แต่ยังมีวิธีที่จะส่งออกไปป์ไลน์จริง ๆ และมีการเรียกใช้หรือไม่ ดูเหมือนจะใช้งานไม่ได้:

!! 2>&1 | tail -n 1 | sh

อีกทั้ง2>&1ส่วนนั้นค่อนข้างยุ่งยากดังนั้นฉันก็อยากรู้ว่าถ้ามีวิธีที่ง่ายกว่าที่จะทำให้มันเกิดขึ้นเช่นกัน

แก้ไข

นอกจากนี้ยังสามารถยอมรับได้ในการบันทึกตัวแปรนี้ไปยังตัวแปรอย่างใดอย่างหนึ่งจากนั้นเรียกใช้ตัวแปร:

!! 2>&1 | tail -n 1 | (store as $mycmd)
$mycmd

แต่ฉันไม่แน่ใจว่าฉันรู้วิธีการไพพ์stdoutเข้าไปในตัวแปรอย่างน้อยก็ไม่ใช่ว่าตัวแปรอยู่ทางด้านขวาของคำสั่ง

คำตอบ:


8

command_not_found_handle()เมื่อคุณพิมพ์คำสั่งที่ไม่ได้อยู่ในระบบของคุณทุบตีทำงานฟังก์ชั่น ในฟังก์ชั่นนี้มีการเรียก/usr/lib/command-not-foundสคริปต์ที่พิมพ์ข้อความ

Ubuntu 12.04

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

หากคุณส่งออกตัวแปรCOMMAND_NOT_FOUND_INSTALL_PROMPTคุณจะถูกขอให้ติดตั้งแพ็คเกจที่ขาดหายไป:

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ export COMMAND_NOT_FOUND_INSTALL_PROMPT=""
pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
Do you want to install it? (N/y)y
sudo apt-get install git
[sudo] password for pbm: 

Ubuntu รุ่นเก่ากว่า

น่าเสียดายที่ไม่มีCOMMAND_NOT_FOUND_INSTALL_PROMPTดังนั้นฉันสามารถหาตัวเลือกอื่น ๆ ไม่กี่:

1) ติดตั้งแพคเกจจาก 12.04 - ไม่ควรเป็นปัญหา - เป็นสคริปต์เพียงไม่กี่ตัวใน Python ดังนั้นจึงควรใช้งานได้ (ยังไม่ทดลอง!)

2) การเปลี่ยนแปลงไปstderr stdoutเมื่อต้องการแก้ไขไฟล์/usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.pyและเปลี่ยนstderrเป็นstdoutในบรรทัด 237 และ 240

หลังจากนั้นคุณสามารถใช้วิธีนี้:

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ `git`
//Installation begins

หากคุณเพิ่ม-yตัวเลือกในapt-getคำสั่งในบรรทัด 237 และ 240 คุณสามารถใช้ไวยากรณ์!! | shได้เช่นกัน

3) คุณสามารถแก้ไขสคริปต์นี้จากบรรทัด 242 ด้วยวิธีนี้:

print >> sys.stderr, _("You can install it by typing:")
f = open("%s/.install-missing" % os.path.expanduser('~'),'w')
print >> sys.stderr, "sudo apt-get install %s" % packages[0][0]
print >> f, "sudo apt-get install %s" % packages[0][0]
f.close()

ด้วยวิธีนี้คุณจะได้รับคำสั่งในไฟล์~/.install-missingดังนั้นคุณอาจสร้างนามแฝง:

alias im="chmod +x ~/.install-missing; ~/.install-missing"

ถ้าคุณโทรหาimแพ็คเกจจะถูกติดตั้ง


อืมมันดูดีมาก แต่จริงๆแล้วมันใช้ไม่ได้กับ 11.10 คนเดียว/usr/lib/command-not-foundแต่ไม่มีการอ้างอิงถึงCOMMAND_NOT_FOUND_INSTALL_PROMPT- ความคิด?
cwd

ตกลงดูเหมือนว่านี่เป็นคุณสมบัติที่จะเป็นส่วนหนึ่งของ 12.04 แม่นยำ ( package-import.ubuntu.com/diffs/command-not-found ) ฉันเดาว่าฉันยังต้องการโซลูชันสำหรับรุ่นก่อนหน้า
cwd

@cwd: ฉันอัปเดตคำตอบของฉัน ...
pbm

3

คุณมาถูกทางด้วย:

!! 2>&1 | tail -n 1 | sh

... แต่คุณกำลังขาดหายไปตัวเลือกให้กับการดวลจุดโทษ พิจารณา:

!! 2>&1 | tail -n 1 | sh -s

และเนื่องจากคุณอาจต้องใช้รูทเพื่อรัน apt-get ให้พิจารณา

!! 2>&1 | tail -n 1 | sudo sh -s

มันใช้งานไม่ได้ sh และ sh -s ทำสิ่งเดียวกันอย่างน้อยในกรณีนี้
Deepak Mittal

1

คุณสามารถทำสิ่งนี้:

!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd

โปรแกรมอินเตอร์แอคทีฟดูเหมือนจะทำงานได้ไม่ดีกับการไพพ์เพราะคาดว่าอินพุต 'Y' ในกรณีนี้ แต่ตัวบ่งชี้ไฟล์ stdin ถูกปิดทันทีที่คำสั่งแรกจบลง


0

คุณสามารถใช้ตัวแปรevalและคำสั่งทดแทนฉันเชื่อ (แม้ว่าฉันไม่แน่ใจว่าทั้งหมดนี้จะปลอดภัย):

TEST_VAR=$(!! 2>&1 | tail -n 1); eval $TEST_VAR

ฉันยินดีที่จะได้รับการพิสูจน์ผิดกับข้างต้น ฉันกำลังทดสอบสิ่งนี้บนเครื่อง Red Hat ด้วยechoคำสั่งแทนที่จะแนะนำอัตโนมัติ bash complete แต่หลักการควรเหมือนกัน

ในตอนท้ายของวันมันจะเร็วกว่าที่จะพิมพ์ git ติดตั้งความสามารถ ...

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