คำสั่ง Linux เพื่อแสดงรายการคำสั่งและนามแฝงที่มีอยู่ทั้งหมด


280

มีคำสั่ง Linux ที่จะแสดงรายการคำสั่งและนามแฝงที่มีอยู่ทั้งหมดสำหรับเทอร์มินัลเซสชันนี้หรือไม่

ราวกับว่าคุณพิมพ์แท็บ 'a' และกด แต่สำหรับตัวอักษรทุกตัว หรือเรียกใช้ 'นามแฝง' แต่กลับคำสั่ง

ทำไม? ฉันต้องการเรียกใช้สิ่งต่อไปนี้และดูว่ามีคำสั่งอยู่หรือไม่:

ListAllCommands | grep searchstr

กดปุ่ม TAB สองครั้งเพื่อแสดงรายการคำสั่งทั้งหมดที่มีให้กับสภาพแวดล้อม
ntshetty

คำตอบ:


599

คุณสามารถใช้ bash (1) ในตัว compgen

  • compgen -c จะแสดงรายการคำสั่งทั้งหมดที่คุณสามารถเรียกใช้ได้
  • compgen -a จะแสดงชื่อแทนทั้งหมดที่คุณสามารถเรียกใช้ได้
  • compgen -b จะแสดงรายการบิวด์อินทั้งหมดที่คุณสามารถเรียกใช้ได้
  • compgen -k จะแสดงรายการคำหลักทั้งหมดที่คุณสามารถเรียกใช้ได้
  • compgen -A function จะแสดงรายการฟังก์ชั่นทั้งหมดที่คุณสามารถเรียกใช้
  • compgen -A function -abck จะแสดงรายการทั้งหมดข้างต้นในครั้งเดียว

ตรวจสอบ man page สำหรับความสำเร็จอื่น ๆ ที่คุณสามารถสร้างได้

หากต้องการตอบคำถามของคุณโดยตรง:

compgen -ac | grep searchstr

ควรทำสิ่งที่คุณต้องการ


1
มีสิ่งนี้เทียบเท่ากับ csh / tcsh หรือไม่? เทอร์มินัลเหล่านั้นยังมีฟังก์ชันการเติมข้อความอัตโนมัติบางอย่างที่ใช้บนแท็บดังนั้นอาจมีบางสิ่งอยู่บ้าง
krb686

2
แทนที่จะเป็นcompgen | grepเช่นนั้นจะมีประสิทธิภาพมากกว่าในการส่งสตริงเป็นอาร์กิวเมนต์ให้กับcompgenตัวเอง (หากรู้ว่าเป็นคำนำหน้าตามที่ระบุไว้ในคำถาม) compgen -ac searchstrในกรณีนี้ว่าจะเป็นอย่างไร
Toby Speight

ที่จริงอูบุนตูแสดงให้เห็นว่า 'ไม่มีอะไรที่เหมาะสม' ในwhatis compgenและ man compgen'ไม่มีรายการคู่มือสำหรับ
MarAvFe

1
@MarAvFe: นั่นเป็นเพราะเป็นbashบิวด์อินไม่ใช่คำสั่งแยกต่างหากที่มี man page ของมันเอง คุณจะต้องอ่านbash(1)man page หรือเรียกใช้help compgenที่bashcommand line
camh

โดยส่วนขยายการทำcompgen -c | sort | uniq | lessจะพิมพ์คำสั่งทั้งหมดที่มีอยู่โดยไม่มีบรรทัดที่ซ้ำกันและเรียงลำดับตามตัวอักษร
Fabián

39

เพิ่มลงใน. bashrc

function ListAllCommands
{
    echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n' | sort -u
}

หากคุณต้องการนามแฝงด้วย:

function ListAllCommands
{
    COMMANDS=`echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n'`
    ALIASES=`alias | cut -d '=' -f 1`
    echo "$COMMANDS"$'\n'"$ALIASES" | sort -u
}

ใกล้มาก แต่ไม่รวมถึงชื่อแทน ฉันจะต่อท้ายนามแฝงอย่างไร ตัด -f1 เป็นผลลัพธ์ แต่ก่อนเรียงลำดับหรือไม่
ack

1
ทำไมต้องทำการเรียงลำดับหากวัตถุประสงค์เพียงอย่างเดียวคือการใส่เอาท์พุตผ่าน grep ปรัชญา Unix คือการทำเครื่องมือง่าย ๆ แล้วเชื่อมโยงเข้าด้วยกันถ้าจำเป็นดังนั้นให้เรียงลำดับจาก ListAllCommands และหากผู้ใช้ต้องการเรียงลำดับผลลัพธ์พวกเขาสามารถทำได้
danio

4
การเรียงลำดับคือการลบรายการที่ซ้ำกัน
มด Aasma

1
นี่ไม่พบคำสั่งที่เป็น symlink ไปยัง executables ใช้ตัวเลือก-Lเพื่อติดตาม symlinks ไปยังปลายทาง หมายเหตุ: -Lเป็นตัวเลือกและไม่ได้เป็นส่วนหนึ่งของนิพจน์ที่ตรงกันเช่นนั้นจะต้องถูกวางไว้ก่อนพา ธ บนบรรทัดคำสั่ง ในกรณีนี้find -L {}
Adaephon

1
อาจต้องการเปลี่ยนเส้นทาง STDERR ไปยัง / dev / null เพื่อยับยั้งคำเตือนไดเรกทอรีที่ไม่มีอยู่ echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(+1 เพื่อความเข้ากันได้กับ zsh)
TheLonelyGhost

27

นั่นคือ

type -a mycommand

คำสั่งซึ่งรายชื่อนามแฝงทั้งหมดและคำสั่งใน $ PATH ที่mycommandถูกนำมาใช้ สามารถใช้เพื่อตรวจสอบว่าคำสั่งมีอยู่ในหลายรูปแบบ นอกเหนือจากนั้น ... อาจมีสคริปต์รอบ ๆ ที่แยกวิเคราะห์ $ PATH และชื่อแทนทั้งหมด แต่ไม่รู้เกี่ยวกับสคริปต์ดังกล่าว


1
แม้ว่ามันจะไม่ใช่คำตอบสำหรับคำถามที่ฉันคิดว่ามันเป็นทางออกที่ดีกว่าสำหรับปัญหาแล้วการเรียกไปที่ grep ดังนั้นคุณสามารถพิมพ์ -a foo และหาก foo ไม่พร้อมใช้งานจะส่งคืนคำสั่งไม่พบหรือสิ่งนั้น ดังนั้นคุณสามารถตรวจสอบคำสั่งได้โดยไม่ต้องเรียกใช้คำสั่งนั้นเอง
Janusz

1
จริงๆแล้วมันคือคำตอบของคำถามตามที่ OP ถามว่า "ฉันต้องการเรียกใช้สิ่งต่อไปนี้และดูว่ามีคำสั่งอยู่หรือไม่" ดังนั้นจุดประสงค์คือเพื่อดูว่ามีคำสั่งหรือไม่และคำตอบนี้ใช้ได้อย่างชัดเจน
lothar

2
@ โลธาร์แล้วถ้าคำสั่งที่คุณต้องการคืออะไรเอ่อมันคืออะไร "startserver"? "serverstart"? "" เซิร์ฟเวอร์ - บางอย่าง - หรือ - อื่น ๆ "? ฉันรู้ว่าฉันแค่ "grep -i" สำหรับเซิร์ฟเวอร์และดูว่ามี อุ่ย Bzzz ไม่ใช่โซลูชันนี้ matey :-) ฉันจะไม่ลงคะแนนในคำตอบนี้ (เนื่องจากมีประโยชน์แม้ว่าในทางที่ จำกัด ) แต่วิธีการแก้ไขแบบเต็มจะพิจารณาว่า grep สำหรับการแสดงออกปกติไม่ใช่แค่การแก้ไขสตริง
paxdiablo

6

ใช้ "ค้นหาแบบไหน" ส่งคืนเส้นทางของไบนารีหรือการตั้งค่านามแฝงหากเป็นนามแฝง

แก้ไข: หากคุณกำลังมองหารายชื่อแทนคุณสามารถใช้:

alias -p | cut -d= -f1 | cut -d' ' -f2

เพิ่มในการค้นหาเส้นทางใดก็ได้ที่คุณต้องการ สมมติว่าคุณกำลังใช้ bash ..


6

คำสั่ง others ไม่ทำงานสำหรับฉันบนระบบฝังตัวเนื่องจากพวกเขาต้องการ bash หรือ xargs เวอร์ชันที่สมบูรณ์มากขึ้น (busybox ถูก จำกัด )

คำสั่งต่อไปนี้ควรทำงานบนระบบที่เหมือน Unix

รายการโดยโฟลเดอร์:

ls $(echo $PATH | tr ':' ' ')

แสดงรายการคำสั่งทั้งหมดตามชื่อ

ls $(echo $PATH | tr ':' ' ') | grep -v '/' | grep . | sort

trยังนี้ต้องอาศัย ทำไมไม่ง่าย ๆls $(echo ${PATH//:/ })?
mschilli

5

ลองใช้สคริปต์นี้:

#!/bin/bash
echo $PATH  | tr : '\n' | 
while read e; do 
    for i in $e/*; do
        if [[ -x "$i" && -f "$i" ]]; then     
            echo $i
        fi
    done
done

นี่เป็นวิธีแก้ปัญหาโค้ดเพียงอย่างเดียวที่ใช้สำหรับคำสั่งทั้งหมดไม่ใช่เพื่อดูว่ามีคำสั่งที่ทราบอยู่หรือไม่ +1
paxdiablo

3

สำหรับผู้ใช้ Mac ( ค้นหาไม่มี -executable และxargsไม่มี -d):

echo $PATH | tr ':' '\n' | xargs -I {} find {} -maxdepth 1 -type f -perm '++x'

ขอบคุณสำหรับสิ่งนี้. จริง ๆ แล้วฉันใช้ non-mac unix ที่ @AntsAasma คำตอบไม่ทำงาน สิ่งนี้ใช้ได้กับฉันใน mac และ unix ของฉันด้วย ฉันสามารถพิมพ์คำสั่งใดเพื่อกำหนดเวอร์ชันยูนิกซ์ที่ฉันเปิดอยู่ได้ดังนั้นฉันสามารถตอบที่นี่เพื่อช่วยเหลือผู้อื่นในการแก้ไขปัญหาของฉัน
prismaticorb

Linux <corporate_proprietary_build_info_here> จ. 12 ธ.ค. 13:34:16 EST 2011 x86_64 x86_64 x86_64 GNU / Linux
prismaticorb

3

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

ใช้: man -k "your keyword"

ใช้ร่วมกับ:| grep "another word"

ตัวอย่างเช่นหากต้องการค้นหาเท็กซ์เอดิเตอร์: man -k editor | grep text


2

ลองกด ALT-? (alt และเครื่องหมายคำถามในเวลาเดียวกัน) ให้เวลาสองหรือสองวินาทีเพื่อสร้างรายการ มันควรจะทำงานในทุบตี


3
หรือลองกดปุ่ม Esc ที่จุดเริ่มต้นของบรรทัดว่างสี่ครั้ง
ephemient

ที่มีประโยชน์ที่น่าอัศจรรย์ใจและฉันไม่ได้รู้อยู่แล้วว่ามันขอบคุณ :-)
คริส Huang-Leaver

2

นี่คือวิธีแก้ปัญหาที่ให้รายการของไฟล์ปฏิบัติการและชื่อแทนทั้งหมดให้คุณ นอกจากนี้ยังสามารถพกพาไปยังระบบที่ไม่มีxargs -d(เช่น Mac OS X) และจัดการเส้นทางที่มีช่องว่างได้อย่างเหมาะสม

#!/bin/bash
(echo -n $PATH | tr : '\0' | xargs -0 -n 1 ls; alias | sed 's/alias \([^=]*\)=.*/\1/') | sort -u | grep "$@"

การใช้: myscript.sh [grep-options] patternเช่นเพื่อค้นหาคำสั่งทั้งหมดที่ขึ้นต้นด้วยlscase-insensitive ให้ทำ:

myscript -i ^ls

2

วิธีลัดเพื่อแสดงรายการคำสั่งทั้งหมด เปิดสถานีและกดครั้งที่สอง"แท็บ"ปุ่ม นั่นแสดงคำสั่งทั้งหมดใน terminal


1
และคุณท่อที่ว่าเป็นgrepอย่างไร
Toby Speight

2

หรือคุณสามารถรับรายการคำสั่งที่สะดวกสบายควบคู่ไปกับคำอธิบายอย่างรวดเร็ว (ตราบใดที่คำสั่งนั้นมี man page ซึ่งส่วนใหญ่ทำ):

apropos -s 1 ''

-s 1 returns only "section 1" manpages which are entries for executable programs.

'' is a search for anything. (If you use an asterisk, on my system, bash throws in a search for all the files and folders in your current working directory.)

จากนั้นคุณก็ grep มันเหมือนที่คุณต้องการ

apropos -s 1 '' | grep xdg

อัตราผลตอบแทน:

xdg-desktop-icon (1) - command line tool for (un)installing icons to the desktop
xdg-desktop-menu (1) - command line tool for (un)installing desktop menu items
xdg-email (1)        - command line tool for sending mail using the user's preferred e-mail composer
xdg-icon-resource (1) - command line tool for (un)installing icon resources
xdg-mime (1)         - command line tool for querying information about file type handling and adding descriptions for new file types
xdg-open (1)         - opens a file or URL in the user's preferred application
xdg-screensaver (1)  - command line tool for controlling the screensaver
xdg-settings (1)     - get various settings from the desktop environment
xdg-user-dir (1)     - Find an XDG user dir
xdg-user-dirs-update (1) - Update XDG user dir configuration

ผลลัพธ์ดูเหมือนจะไม่ถูกจัดเรียงดังนั้นหากคุณกำลังมองหารายการที่มีความยาวคุณสามารถโยน | จัดเรียง | ตรงกลางแล้วต่อท่อนั้นเข้ากับเพจเจอร์อย่างน้อย / มาก / มากที่สุด Ala:

apropos -s 1 '' | sort | grep zip | less

ซึ่งส่งกลับรายการเรียงลำดับของคำสั่งทั้งหมดที่มี "zip" ในชื่อหรือคำอธิบายสั้น ๆ และปั๊มที่เพจเจอร์ "น้อย" (คุณสามารถแทนที่ "น้อยลง" ด้วย $ PAGER และใช้เพจเจอร์เริ่มต้น)


1

คุณสามารถทำสิ่งต่อไปนี้ได้เสมอ:

1. Hold the $PATH environment variable value.
2. Split by ":"
3. For earch entry: 
    ls * $entry 
4. grep your command in that output.

เชลล์จะดำเนินการคำสั่งเฉพาะเมื่อมีการระบุไว้ในพา ธ env var อย่างไรก็ตาม


1

มันขึ้นอยู่กับว่าฉันหมายความว่ามันขึ้นอยู่กับสิ่งที่คุณใช้เปลือก นี่คือข้อ จำกัด ที่ฉันเห็น:

  1. ต้องทำงานในกระบวนการเดียวกับเชลล์ของคุณเพื่อจับสมนามและฟังก์ชั่นและตัวแปรที่มีผลต่อคำสั่งที่คุณสามารถหาได้ให้คิดว่า PATH หรือ EDITOR แม้ว่า EDITOR อาจอยู่นอกขอบเขต คุณสามารถมีตัวแปรที่ไม่ได้เอ็กซ์พอร์ตซึ่งมีผลต่อสิ่งต่าง ๆ
  2. มันเป็นเชลล์ที่เฉพาะเจาะจงหรือการออกไปสู่เคอร์เนลของคุณ / proc / pid / enviorn และเพื่อน ๆ มีข้อมูลไม่เพียงพอ

ฉันใช้ ZSH ดังนั้นนี่คือคำตอบ zsh มันทำ 3 สิ่งต่อไปนี้:

  1. เส้นทางทิ้ง
  2. ทิ้งชื่อนามแฝง
  3. ดัมพ์ฟังก์ชันที่อยู่ใน env
  4. เรียงลำดับพวกเขา

นี่มันคือ:

feed_me() {
    (alias | cut -f1 -d= ; hash -f; hash -v | cut -f 1 -d= ; typeset +f) | sort
}

หากคุณใช้ zsh สิ่งนี้ควรทำ


0

ปัญหาคือการทำให้แท็บเสร็จสมบูรณ์กำลังค้นหาเส้นทางของคุณ แต่คำสั่งทั้งหมดไม่ได้อยู่ในเส้นทางของคุณ

หากต้องการค้นหาคำสั่งในเส้นทางของคุณโดยใช้ bash คุณสามารถทำสิ่งต่อไปนี้:

สำหรับ x ในecho $PATH | cut -d":" -f1; ทำ ls $ x; เสร็จแล้ว


0

นี่คือฟังก์ชั่นที่คุณสามารถใส่ในไฟล์ bashrc ของคุณ:

ฟังก์ชั่นคำสั่งค้นหา
{
   oldIFS = $ {} ไอเอฟเอ
   ไอเอฟเอ = ":"

   สำหรับ p ใน $ {PATH}
   ทำ
      ls $ p | grep $ 1
   เสร็จแล้ว

   ส่งออก IFS = $ {oldIFS}
}

ตัวอย่างการใช้งาน:

$ คำสั่งค้นหาคำพังเพย
gnome-เสียงโปรไฟล์-คุณสมบัติ *
gnome-ดีดออก @
gnome-พวงกุญแจ *
gnome-พวงกุญแจ-ภูต *
gnome-mount *
gnome-เปิด *
gnome-เสียงบันทึก *
gnome-แก้ไขข้อความ @
gnome-umount @
คำพังเพยที่มีปริมาณการควบคุม *
polkit-gnome-อนุมัติ *
vim.gnome *
$

FYI: IFS เป็นตัวแปรที่ bash ใช้เพื่อแยกสตริง

แน่นอนว่าอาจมีวิธีที่ดีกว่าในการทำเช่นนี้


-1

บางทีฉันอาจเข้าใจผิด แต่ถ้าคุณกด Escape จนกว่าคุณจะมี Display All X เป็นไปได้


-2
compgen -c > list.txt && wc list.txt

1
ลองเพิ่มคำอธิบายสั้น ๆ ว่าสิ่งนี้ทำอะไรหรือควรทำอย่างไร อย่างน้อยที่สุดให้ระบุลิงค์อ้างอิง (โดยปกติคือหน้าคนที่เกี่ยวข้อง) สำหรับการติดตามและทำความเข้าใจเกี่ยวกับวิธีแก้ไขปัญหาที่เสนอ
TheCodeArtist

การใช้ไฟล์ไม่ใช่ตัวเลือกที่ดีเสมอไป หากคุณต้องการอย่างน้อยทำให้มันเป็นไฟล์ tmp (ถ้าการรักษาความปลอดภัยไม่เป็นปัญหา)compgen -c > /tmp/list.txt && /tmp/wc list.txt
Gary

-3

ทำไมคุณไม่พิมพ์เพียง:

seachstr

ในอาคารผู้โดยสาร

เชลล์จะบอกว่าชอบผู้หญิง

seacrhstr: command not found 

แก้ไข:

ตกลงฉันลงคะแนนเพราะคำตอบคือโง่ฉันแค่อยากรู้ว่ามีอะไรผิดปกติกับคำตอบนี้ !!! ผู้ถามตอบว่า:

และดูว่ามีคำสั่งอยู่หรือไม่

การพิมพ์คำสั่งจะบอกคุณว่ามีหรือไม่!

น่าจะเป็นเขา / เธอหมายถึง"ที่มีออกมาดำเนินการคำสั่ง" หรือ"เพื่อรวมไว้ในสคริปต์"แต่ฉันไม่สามารถอ่านใจของเขา (ไม่ได้ว่าฉันไม่สามารถเป็นประจำก็เป็นเพียงว่าเขาสวม ดันใจในการอ่าน )


4
ฉันต้องการทราบว่าformathddมีคำสั่งอยู่หรือไม่ โอ้เดี๋ยวก่อนฉันแค่วิ่งไปและเห็น gee ขอบคุณ :)
Jeffrey Jose

5
อาจปลอดภัยกว่าในการใช้ 'ซึ่ง' เพื่อทำเช่นนั้น
danio

ระบุว่านี่เป็นStack Overflowไม่ใช่Super Userคำตอบจากโปรแกรมจะเหมาะสมกว่า
Toby Speight

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