จะทำให้ `คนทำงานได้อย่างไรสำหรับคำสั่งและคำหลักของเชลล์บิวด์อิน?


56

ฉันใช้manคำสั่งตลอดเวลาเมื่อฉันต้องการรับข้อมูลเกี่ยวกับคำสั่งเฉพาะ แต่สิ่งนี้ไม่ได้ช่วยฉันมากเกินไปเมื่อคำสั่งเฉพาะนั้นเป็นเชลล์ในตัว ตัวอย่างเช่น:

man cd

ผลตอบแทน:

No manual entry for cd

คำถามของฉันคือมันเป็นไปได้ที่จะทำให้การmanทำงานสำหรับทุกคำสั่งเชลล์ builtin (เช่นcd, alias, historyฯลฯ ) และคำหลัก (เช่นif, while, [[, {ฯลฯ )?


และทำไมechoคำสั่งบิวอินจึงมีหน้าคน?
Parto

5
@AvatarParto echoยังเป็นคำสั่งระบบ (ปฏิบัติการ) /binที่ตั้งอยู่ใน type -a echoคุณสามารถตรวจสอบการใช้นี้ สิ่งเดียวกันเกิดขึ้นกับtimeและบางทีคนอื่น ๆ
Radu Rădeanu

คุณสำรวจinfo bashหรือยัง
bbaassssiiee

คุณสามารถเขียนหน้าคนของคุณเองได้ตลอดเวลา
Elliott Frisch

คำตอบ:


66

helpคำสั่งเมื่อใช้กับ-mตัวเลือกที่สามารถแสดงข้อมูลเกี่ยวกับ builtin คำสั่งในรูปแบบหลอก manpage ตัวอย่างเช่น:

help -m cd | less

จะแสดงข้อมูลเกี่ยวกับcdคำสั่งในรูปแบบเกือบจะเหมือนกับในหน้าคู่มือ

เริ่มต้นจากคำสั่งนี้คุณสามารถตัดmanคำสั่งในฟังก์ชั่นเดียวใน.bashrcไฟล์ของคุณดังต่อไปนี้:

man () {
    case "$(type -t -- "$1")" in
    builtin|keyword)
        help -m "$1" | sensible-pager
        ;;
    *)
        command man "$@"
        ;;
    esac
}

หลังจากนี้manจะทำงานสำหรับคำสั่งและคำหลักของเชลล์ builtin ทั้งหมดด้วย ตัวอย่างเช่น:

man :

จะแสดง:

NAME
    : - Null command.

SYNOPSIS
    :

DESCRIPTION
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

SEE ALSO
    bash(1)

IMPLEMENTATION
    GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)
    Copyright (C) 2011 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

วิธีการที่ฉลาดมาก! +1
phatskat

5
หากมี executables ที่ถูกพรางโดย builtins คุณสามารถระบุส่วนได้ man timevs.man 1 time
OrangeDog

1
... โปรดทราบว่าแม้ว่าคุณจะเป็นzshผู้ใช้ของคุณโชคดีมาก: bugs.launchpad.net/ubuntu/+source/zsh/+bug/1242108 (ไม่มีการติดตั้ง man pages)
Rmano

info, help -mทำไมเราไม่สามารถเพียงแค่มีหน้าคนดีวันนี้? อย่างไรก็ตามขอบคุณ!
Tor Klingberg

+1 ... ดี! พฤติกรรมของฟังก์ชั่น yr คล้ายกับสิ่งที่เกิดขึ้นผ่านฟังก์ชั่นโอเวอร์โหลดใน C / C ++ ... เพียง แต่อยากรู้อยากเห็นman typeไม่ได้ผลิตคำอธิบายของตัวเลือก "-a" หรือ "-t" ใน Ubuntu 14.04.4 .... และยังพวกเขา ที่นั่น!
Cbhihe

28
man bash-builtins

สิ่งนี้มีตัวอย่างความช่วยเหลือสำหรับคำสั่ง builtin แม้ว่าจะอยู่ในรูปแบบย่อมากกว่าที่helpเทียบเท่าเล็กน้อย


ดีแล้วที่รู้! มาจากส่วนที่ 7 ของคู่มือ ฉันไม่เคยได้ยินเกี่ยวกับหน้าคู่มือนี้มาก่อนจนกระทั่งตอนนี้ +1 แต่ฉันไม่สามารถยอมรับคำตอบนี้ได้เพราะไม่ใช่สิ่งที่ฉันถาม
Radu Rădeanu

ใน macOS High Sierra คำสั่งนั้นเป็นเพียงแค่ "คนในตัว"
Tony Barganski

13

คุณสามารถติดตั้งหน้าคู่มือเกี่ยวกับการใช้ระบบ POSIX เพื่อการพัฒนาเป็น,

sudo apt-get install manpages-posix-dev

มันจะให้หน้าคนสำหรับ shell builtins

$ type cd
cd is a shell builtin

ตอนนี้ลอง

$ man cd
CD(P)                      POSIX Programmer's Manual                      CD(P)

NAME
   cd - change the working directory

SYNOPSIS
   cd [-L | -P] [directory]


...

3
ฉันรอคนที่จะมาพร้อมกับคำตอบนี้ แต่ปัญหาคือว่านี้จะทำงานให้ builtins บาง - ที่ระบุไว้โดย POSIX
Radu Rădeanu

3
Bash ไม่ยึดติดกับ POSIX อย่างเคร่งครัดเว้นแต่ว่าจะทำงานในโหมด POSIX ดังนั้น man page เหล่านี้อาจไม่ครอบคลุมและอาจผิดในบางสถานการณ์โดยเฉพาะอย่างยิ่งเมื่ออธิบายพฤติกรรมของคุณสมบัติบางอย่าง
Chris Down

@ RaduRădeanuใช่คุณถูกต้องอย่างแน่นอนมันจะทำงานให้กับ builtins บางตัว
souravc

3

วิธีแก้ปัญหานี้ทำงานได้อย่างสมบูรณ์แบบ แต่ก็เป็นเรื่องตลกเช่นกันเพราะสิ่งแรกที่ฉันคิดว่าเมื่อฉันอ่านคำถามของคุณคือ 'ใครยังคงใช้มนุษย์จากบรรทัดคำสั่งอย่างแท้จริง? ทุกคนไม่ใช่แค่ Google เท่านั้นที่เป็นหน้าคนที่พวกเขาต้องการ จากนั้นฉันก็รู้ว่าไซต์ที่ฉัน Google มักจะมีทั้งคำสั่งทั้งสองประเภทดังนั้นทำไมไม่เพียงแค่ใช้มันเพื่อจัดเตรียมอินเทอร์เฟซของ man page ที่เหมือนกันในทุกคำสั่ง ดังนั้นความสนุกนี้จึงเกิดขึ้น

ต้องใช้การเชื่อมต่ออินเทอร์เน็ตสำหรับรายการใด ๆ ที่คุณยังไม่ได้ค้นหาอย่างน้อยหนึ่งครั้ง นอกจากนี้ยังต้องการแอพเล็ก ๆ สองตัวที่หายไปจากการติดตั้งเริ่มต้นของ Ubuntu:

 sudo apt-get install tidy html2text

สิ่งเหล่านี้ไม่จำเป็นจริงๆ แต่ช่วยทำให้ดูดีขึ้นหน่อย Tidy จะทำความสะอาด HTML และ html2text จะจัดรูปแบบ html นั้นเป็นข้อความที่จัดรูปแบบ (ซึ่งมักไม่ค่อยน่าสนใจเนื่องจากไซต์เหล่านี้ส่วนใหญ่มีการจัดรูปแบบข้อความแล้วและเพิ่งถูกห่อด้วยแท็ก <pre>

ตอนนี้สิ่งที่คุณต้องทำคือการเพิ่มนี้ในตอนท้ายของ~/.profile:

function iman() {
    if [ ! -d "/usr/share/iman" ]; then
        sudo mkdir -m a=rwx /usr/share/iman
    fi
    if [ ! -f "/usr/share/iman/$1.html" ]; then
        curl "http://unixhelp.ed.ac.uk/CGI/man-cgi?$1"| tidy -n -asxml 2>/dev/null| html2text > "/usr/share/iman/$1.html"; 
    fi
    if [ -f "/usr/share/iman/$1.html" ]; then
        cat "/usr/share/iman/$1.html";
    else
        echo "Entry not found."
    fi
}

หลังจากที่คุณออกจากระบบแล้วกลับมาคุณควรจะพิมพ์สิ่งนี้:

iman cd

cdและมันจะแสดงหน้าคนสำหรับ

นี้ใช้ไดเรกทอรีข้อมูล (/ usr / share / iman) เพื่อลดความต้องการเครือข่ายของเรา (ดังนั้นมันจะทำงานสำหรับรายการที่คุณเคยพบมาก่อนแม้จะไม่มีการเชื่อมต่อยังลดภาระบนไซต์ man linux แบบสุ่มนี้ ฉันพบกับรายการระบบที่เราต้องการเช่นกัน) หากคุณไม่ได้ใช้สิ่งนี้อีกต่อไปคุณจะต้องลบสิ่งนั้นเพื่อกู้คืนพื้นที่ว่างในดิสก์

หวังว่าส่วนที่เหลือจะค่อนข้างตรงไปข้างหน้า


6
'ใครยังคงใช้มนุษย์จากบรรทัดคำสั่งอย่างแท้จริง?' ฉัน! และคนอื่น ๆ ที่ต้องไปดาต้าเซ็นเตอร์ (ไม่มีอินเทอร์เน็ต))
Rinzwind

ชี้ไปที่สิ่งนี้จะไม่ช่วยให้คุณมีความชัดเจน
krowe

6
ฉันคิดว่าสิ่งที่ตรงกันข้ามฉันไม่เคยใช้ Google เพื่อค้นหาคำสั่งทุบตี มันเร็วกว่ามากแค่พิมพ์ "คำสั่ง man" โดยไม่ต้องออกจากคีย์บอร์ด
เรน

alt + tab -> alt + d -> คำสั่งจะทำเช่นเดียวกันโดยไม่ใช้เม้าส์และโดยไม่ยกเลิกคำสั่ง cli ปัจจุบันและด้วยการเลื่อนและมีสิ่งดีๆอีกนับล้านที่เบราว์เซอร์จะมอบให้คุณ ฉันแน่ใจว่าคุณจะไม่ทราบอะไรเกี่ยวกับเรื่องนี้เพราะคุณใช้เว็บไซต์นี้และคนอื่น ๆ ชอบมันจาก lynx ... ffs
krowe

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