Perintah Linux untuk mendaftar semua perintah dan alias yang tersedia


280

Apakah ada perintah Linux yang akan mencantumkan semua perintah dan alias yang tersedia untuk sesi terminal ini?

Seolah-olah Anda mengetik 'a' dan menekan tab, tetapi untuk setiap huruf alfabet. Atau menjalankan 'alias' tetapi juga mengembalikan perintah.

Mengapa? Saya ingin menjalankan yang berikut dan melihat apakah perintah tersedia:

ListAllCommands | grep searchstr

tekan tombol TAB dua kali untuk membuat daftar semua perintah yang tersedia dengan lingkungan
ntshetty

Jawaban:


599

Anda dapat menggunakan bash (1) bawaan compgen

  • compgen -c akan mencantumkan semua perintah yang dapat Anda jalankan.
  • compgen -a akan mencantumkan semua alias yang dapat Anda jalankan.
  • compgen -b akan mencantumkan semua bawaan yang dapat Anda jalankan.
  • compgen -k akan mencantumkan semua kata kunci yang dapat Anda jalankan.
  • compgen -A function akan mencantumkan semua fungsi yang dapat Anda jalankan.
  • compgen -A function -abck akan mendaftar semua hal di atas dalam sekali jalan.

Periksa halaman manual untuk penyelesaian lain yang dapat Anda hasilkan.

Untuk langsung menjawab pertanyaan Anda:

compgen -ac | grep searchstr

harus melakukan apa yang Anda inginkan.


1
Apakah ada yang setara dengan ini untuk csh / tcsh? Terminal-terminal itu juga memiliki semacam fungsi pelengkapan otomatis yang digunakan pada tab, jadi mungkin ada sesuatu?
krb686

2
Alih-alih compgen | grep, bisa lebih efisien untuk meneruskan string sebagai argumen ke compgendirinya sendiri (jika itu dikenal sebagai awalan, seperti tersirat dalam pertanyaan). Dalam hal ini, itu akan terjadi compgen -ac searchstr.
Toby Speight

Sebenarnya, ubuntu menunjukkan 'tidak ada yang sesuai' di whatis compgendan 'Tidak ada entri manual' untuk man compgen.
MarAvFe

1
@MarAvFe: Itu karena itu adalah bashperintah bawaan , bukan perintah terpisah dengan halaman manualnya sendiri. Anda harus membaca bash(1)halaman manual, atau menjalankannya help compgendi bashbaris perintah.
camh

Dengan ekstensi, melakukan compgen -c | sort | uniq | lessakan mencetak semua perintah yang tersedia tanpa garis duplikat dan diurutkan berdasarkan abjad.
Fabián

39

Tambahkan ke .bashrc

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

Jika Anda juga ingin alias, maka:

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
}

Ini sangat dekat tetapi tidak termasuk alias. Bagaimana saya bisa menambahkan alias | memotong -f1 ke hasil tetapi sebelum menyortir?
ack

1
Kenapa repot-repot menyortir jika satu-satunya tujuan adalah untuk menempatkan output melalui grep? Filosofi Unix adalah membuat alat-alat sederhana dan kemudian menyatukannya jika diperlukan, jadi tinggalkan Sortir dari ListAllCommands dan jika pengguna ingin output diurutkan mereka dapat melakukannya.
danio

4
Sortirnya adalah untuk menghapus duplikat.
Semut Aasma

1
Ini tidak menemukan perintah yang merupakan symlink ke executable. Gunakan opsi -Luntuk mengikuti symlink ke tujuan mereka. Catatan: -Ladalah opsi dan bukan bagian dari ekspresi yang cocok, karena itu harus ditempatkan sebelum jalur pada baris perintah. Dalam hal inifind -L {}
Adaephon

1
Mungkin ingin mengarahkan STDERR ke / dev / null untuk menekan peringatan direktori yang tidak ada. echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(+1 untuk kompatibilitas zsh)
TheLonelyGhost

27

Ada

type -a mycommand

perintah yang mencantumkan semua alias dan perintah dalam $ PATH di mana perintah saya digunakan. Dapat digunakan untuk memeriksa apakah perintah ada dalam beberapa varian. Selain itu ... Mungkin ada beberapa skrip di sekitar yang mem-parsing $ PATH dan semua alias, tetapi tidak tahu tentang skrip semacam itu.


1
Bahkan jika itu bukan jawaban untuk pertanyaan saya pikir itu adalah solusi yang lebih baik untuk masalah ini maka panggilan untuk grep. Jadi Anda dapat melakukan ketik -a foo dan jika foo tidak tersedia, ia mengembalikan perintah yang tidak ditemukan atau sesuatu seperti itu. Jadi Anda dapat memeriksa perintah tanpa memanggil perintah itu sendiri.
Janusz

1
Sebenarnya ini adalah jawaban untuk pertanyaan, karena OP bertanya "Saya ingin menjalankan yang berikut dan melihat apakah perintah tersedia", jadi tujuannya adalah untuk melihat apakah perintah tersedia dan jawaban ini jelas berfungsi.
lothar

2
@lothar, bagaimana jika perintah yang Anda cari adalah, eh, apa itu, "server awal" ?, "server mulai" ?, "server-sesuatu-atau-lainnya" ?. Saya tahu, saya akan "grep -i" untuk server dan melihat apakah ada di sana. Ups. Bzzz, tidak dengan solusi ini. matey :-) Saya tidak akan memilih jawaban ini (karena ini berguna walaupun dalam cara yang terbatas) tetapi solusi lengkap akan memperhitungkan bahwa grep adalah untuk ekspresi reguler , bukan hanya string yang diperbaiki.
paxdiablo

6

Gunakan "pencarian yang mana". Mengembalikan path biner atau pengaturan alias jika itu adalah alias

Sunting: Jika Anda mencari daftar alias, Anda dapat menggunakan:

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

Tambahkan itu ke dalam jawaban pencarian PATH mana pun yang Anda suka. Anggap Anda menggunakan bash ..


6

Perintah yang lain tidak berfungsi untuk saya pada embedded system, karena mereka membutuhkan bash atau versi xarg yang lebih lengkap (busybox terbatas).

Perintah-perintah berikut harus bekerja pada sistem seperti Unix.

Daftar menurut folder:

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

Daftar semua perintah dengan nama

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

Ini masih mengandalkan tr. Kenapa tidak sederhana saja ls $(echo ${PATH//:/ })?
mschilli

5

Coba skrip ini:

#!/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

Ini adalah satu-satunya solusi kode sejauh ini yang melakukannya untuk semua perintah, bukan hanya untuk melihat apakah ada perintah yang diketahui. +1.
paxdiablo

3

Untuk pengguna Mac ( find tidak memiliki -executable dan xargs tidak memiliki -d):

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

Terima kasih untuk ini. Saya sebenarnya menggunakan unix non-mac di mana jawaban @AntsAasma tidak bekerja. Ini berfungsi untuk saya di mac dan unix saya juga. Perintah apa yang bisa saya ketik untuk menentukan versi unix saya, jadi saya bisa menjawab di sini untuk membantu orang lain dengan masalah saya?
prismaticorb

Linux <corporate_proprietary_build_info_here> Sen 12 Des 13:34:16 EST 2011 x86_64 x86_64 x86_64 GNU / Linux
prismaticorb

3

Berguna untuk membuat daftar perintah berdasarkan kata kunci yang terkait dengan perintah.

Menggunakan: man -k "your keyword"

merasa bebas untuk bergabung dengan:| grep "another word"

misalnya, untuk menemukan editor teks: man -k editor | grep text


2

Coba tekan ALT-? (alt dan tanda tanya pada saat yang sama). Berikan satu atau dua detik untuk membangun daftar. Itu harus bekerja di bash.


3
Atau coba tekan Esc pada awal baris kosong empat kali.
sesaat

Itu luar biasa berguna, dan saya belum mengetahuinya terima kasih :-)
Chris Huang-Leaver

2

Inilah solusi yang memberi Anda daftar semua executable dan alias. Ini juga portabel untuk sistem tanpa xargs -d(misalnya Mac OS X), dan dengan benar menangani jalur dengan spasi di dalamnya.

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

Penggunaan:, myscript.sh [grep-options] patternmisalnya untuk menemukan semua perintah yang dimulai dengan ls, case-insensitive, lakukan:

myscript -i ^ls

2

metode pintas untuk mencantumkan semua perintah. Buka terminal dan tekan dua kali tombol "tab" . Itu menunjukkan semua perintah di terminal


1
Dan Anda menyalurkannya ke grepbagaimana tepatnya?
Toby Speight

2

Atau, Anda bisa mendapatkan daftar perintah yang nyaman ditambah dengan deskripsi cepat (selama perintah memiliki halaman manual, yang kebanyakan dilakukan):

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.)

Maka Anda hanya mengambilnya seperti yang Anda inginkan.

apropos -s 1 '' | grep xdg

hasil:

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

Hasilnya tampaknya tidak diurutkan, jadi jika Anda mencari daftar panjang, Anda bisa melempar | sortir | ke tengah, dan kemudian pipa itu ke pager seperti kurang / lebih / paling. ala:

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

Yang mengembalikan daftar semua perintah yang diurutkan yang memiliki "zip" dalam nama mereka atau deskripsi singkat mereka, dan memompa bahwa pager "kurang". (Anda juga bisa mengganti "kurang" dengan $ PAGER dan menggunakan pager default.)


1

Anda selalu dapat mengikuti yang berikut:

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

Shell akan menjalankan perintah hanya jika mereka terdaftar di path env var.


1

itu tergantung, maksud saya itu tergantung pada shell apa yang Anda gunakan. berikut adalah kendala yang saya lihat:

  1. harus berjalan dalam proses yang sama seperti shell Anda, untuk menangkap alias dan fungsi dan variabel yang akan mempengaruhi perintah yang dapat Anda temukan, pikirkan PATH atau EDITOR walaupun EDITOR mungkin berada di luar ruang lingkup. Anda dapat memiliki variabel yang tidak diekspor yang dapat mempengaruhi hal-hal.
  2. itu khusus shell atau Anda pergi ke kernel, / proc / pid / enviorn dan teman-teman tidak memiliki informasi yang cukup

Saya menggunakan ZSH jadi di sini adalah jawaban zsh, ia melakukan 3 hal berikut:

  1. jalur dumps
  2. kesedihan nama alias
  3. fungsi dump yang ada di env
  4. macam mereka

ini dia:

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

Jika Anda menggunakan zsh, ini harus dilakukan.


0

Masalahnya adalah bahwa penyelesaian tab mencari jalur Anda, tetapi semua perintah tidak ada di jalur Anda.

Untuk menemukan perintah di jalur Anda menggunakan bash, Anda dapat melakukan sesuatu seperti:

untuk x in echo $PATH | cut -d":" -f1; lakukan ls $ x; selesai


0

Inilah fungsi yang bisa Anda masukkan ke file bashrc Anda:

fungsi pencarian perintah
{
   oldIFS = $ {IFS}
   IFS = ":"

   untuk p dalam $ {PATH}
   melakukan
      ls $ p | ambil $ 1
   selesai

   ekspor IFS = $ {oldIFS}
}

Contoh penggunaan:

$ perintah-pencarian gnome
gnome-audio-profil-properties *
gnome-eject @
gnome-keyring *
gnome-keyring-daemon *
gnome-mount *
gnome-open *
gnome-sound-recorder *
gnome-text-editor @
gnome-umount @
gnome-volume-control *
polkit-gnome-otorisasi *
vim.gnome *
$

FYI: IFS adalah variabel yang digunakan bash untuk membagi string.

Tentunya mungkin ada beberapa cara yang lebih baik untuk melakukan ini.


-1

mungkin saya salah paham tetapi bagaimana jika Anda menekan Escape sampai Anda mendapatkan kemungkinan Display All X?


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

1
Pertimbangkan untuk menambahkan deskripsi singkat tentang apa yang dilakukan atau bagaimana ini seharusnya bekerja. Paling tidak, tentukan tautan referensi (biasanya halaman manual yang relevan) untuk menindaklanjuti dan memahami solusi yang diusulkan.
TheCodeArtist

Menggunakan file tidak selalu merupakan opsi yang baik. Jika Anda memang perlu, maka setidaknya buatlah file tmp (jika keamanan tidak menjadi masalah.)compgen -c > /tmp/list.txt && /tmp/wc list.txt
Gary

-3

Mengapa Anda tidak mengetik saja:

seachstr

Di terminal.

Shell akan mengatakan sesuatu

seacrhstr: command not found 

EDIT:

Ok, saya mengambil downvote, karena jawabannya bodoh, saya hanya ingin tahu: Apa yang salah dengan jawaban ini !!! Penanya berkata:

dan lihat apakah ada perintah.

Mengetik perintah akan memberi tahu Anda jika tersedia !.

Mungkin dia bermaksud "tanpa melaksanakan perintah" atau "memasukkannya ke dalam naskah" tetapi saya tidak bisa membaca pikirannya (bukan karena saya tidak bisa secara teratur hanya karena dia memakai deflektor membaca pikiran )


4
Saya ingin tahu apakah formathddperintah itu ada. Oh, tunggu, saya hanya menjalankannya dan melihatnya. Wah. Terima kasih :)
Jeffrey Jose

5
Mungkin lebih aman menggunakan 'yang' untuk melakukan itu.
danio

Mengingat ini adalah Stack Overflow , bukan Super User , jawaban terprogram akan lebih tepat.
Toby Speight

-5

dalam bahasa debian: ls / bin / | grep "whatImSearchingFor"


1
executable ada di semua direktori dalam $ PATH, bukan hanya / bin.
PhrkOnLsh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.