ขอลงในเครื่องจัดการคำสั่งไม่พบคำสั่งใน Ubuntu


9

ฉันต้องการขอเข้าสู่ handler เพื่อหาคำสั่งไม่พบ

wim@SDFA100461C:~$ thing
No command 'thing' found, did you mean:
 Command 'tping' from package 'lam-runtime' (universe)
 Command 'thin' from package 'thin' (universe)
thing: command not found

ฉันต้องการแทนที่พฤติกรรมนี้ด้วยสคริปต์ของฉันเอง

โดยเฉพาะฉันต้องการตรวจสอบว่าคำสั่งมีอยู่ในผลลัพธ์ของlsvirtualenv -bและถ้าเป็นเช่นนั้นฉันต้องการเปิดใช้งาน virtualenv นั้น

ฉันจะเริ่มแฮ็คได้ที่ไหน


1
สิ่งนี้อาจช่วยได้: askubuntu.com/a/73282/10127
glenn jackman

คำตอบ:


8

โดยทั่วไป

Linux Journalมีบทความที่ดีงาม:

จากหน้าคนของทุบตี:

... การค้นหาไดเรกทอรีทั้งหมดใน PATH จะดำเนินการเฉพาะในกรณีที่ไม่พบคำสั่งในตารางแฮช หากการค้นหาไม่สำเร็จเชลล์จะค้นหาฟังก์ชันเชลล์ที่กำหนดไว้ชื่อ command_not_found_handle หากฟังก์ชันนั้นมีอยู่ระบบจะเรียกใช้งานด้วยคำสั่งดั้งเดิมและอาร์กิวเมนต์ของคำสั่งเดิมเป็นอาร์กิวเมนต์และสถานะการออกของฟังก์ชันจะกลายเป็นสถานะออกของเชลล์ หากไม่ได้กำหนดฟังก์ชันนั้นเชลล์จะพิมพ์ข้อความแสดงข้อผิดพลาดและส่งคืนสถานะออกที่ 127

และ

grep ที่รวดเร็วใน / etc ค้นพบว่าเกิดอะไรขึ้น ฟังก์ชั่นนั้นอยู่ใน / etc / bash_command_not_found และฟังก์ชั่นนั้นได้รับการรวมไว้ (ถ้ามีอยู่) ในเซสชัน bash ของคุณผ่าน /etc/bash.bashrc

Ubuntu 14.04

หลักฐานเชิงประจักษ์แสดงให้เห็นว่าในการติดตั้ง Ubuntu 14.04 ไฟล์ / etc / bash_command_not_found ไม่มีอยู่อย่างไรก็ตามไฟล์ที่ถูกต้องคือสคริปต์ python ซึ่งอยู่ที่/ usr / lib / command-not-found


1
ชุดนี้ผมอยู่บนเส้นทางที่ถูกต้อง /usr/lib/command-not-foundแต่โปรแกรมที่เกิดขึ้นจริงเป็นสคริปต์หลามอยู่ที่ ในการติดตั้ง Ubuntu 14.04 ของฉัน/etc/bash_command_not_foundไม่มีไฟล์อยู่
Wim

ขอบคุณฉันได้เพิ่มสิ่งนั้นไว้ในคำตอบสำหรับผู้ชมในอนาคต
Andrew Stubbs

1

สำหรับbash, พฤติกรรมของมันจะถูกควบคุมโดยฟังก์ชั่นเชลล์command_not_found_handle(ดูman bash, ภายใต้ COMMAND EXECUTION)

หากต้องการดูว่าพฤติกรรมใดที่กำหนดโดยฟังก์ชันนั้นคุณสามารถออก:

declare -p -f command_not_found_handle

คุณสามารถเปลี่ยนโปรแกรมที่ใช้โดยการกำหนดcommand_not_found_handleฟังก์ชันใหม่

ใน Ubuntu 14.04 LTS ดูเหมือนว่าพฤติกรรมเริ่มต้นจะถูกกำหนดโดยตรงใน/etc/bash.bashrc:

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
    function command_not_found_handle {
            # check because c-n-f could've been removed in the meantime
            if [ -x /usr/lib/command-not-found ]; then
               /usr/lib/command-not-found -- "$1"
               return $?
            elif [ -x /usr/share/command-not-found/command-not-found ]; then
               /usr/share/command-not-found/command-not-found -- "$1"
               return $?
            else
               printf "%s: command not found\n" "$1" >&2
               return 127
            fi
    }
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.