Kullanılabilir tüm komutları ve diğer adları listelemek için Linux komutu


280

Bu terminal oturumu için kullanılabilir tüm komutları ve diğer adları listeleyecek bir Linux komutu var mı?

Sanki 'a' yazıp sekmeye bastınız, fakat alfabenin her harfi için. Veya 'takma ad' çalıştırırken aynı zamanda komutları döndürmek.

Neden? Aşağıdakileri çalıştırmak ve bir komutun mevcut olup olmadığını görmek istiyorum:

ListAllCommands | grep searchstr

ortam için kullanılabilir tüm komutları listelemek için SEKME tuşuna iki kez basın
ntshetty

Yanıtlar:


599

Dahili bash (1) kullanabilirsiniz compgen

  • compgen -c çalıştırabileceğiniz tüm komutları listeleyecektir.
  • compgen -a çalıştırabileceğiniz tüm diğer adları listeleyecektir.
  • compgen -b çalıştırabileceğiniz tüm yerleşikleri listeler.
  • compgen -k çalıştırabileceğiniz tüm anahtar kelimeleri listeler.
  • compgen -A function çalıştırabileceğiniz tüm işlevleri listeler.
  • compgen -A function -abck yukarıdakilerin tümünü tek seferde listeleyecektir.

Üretebileceğiniz diğer tamamlamalar için kılavuz sayfasına bakın.

Sorunuzu doğrudan cevaplamak için:

compgen -ac | grep searchstr

ne istersen yapmalısın.


1
Buna csh / tcsh için bir eşdeğer var mı? Bu terminallerde ayrıca sekmede kullanılan bir tür otomatik tamamlama işlevi vardır, bu yüzden belki bir şey var mı?
krb686

2
Bunun yerine compgen | grep, dizeyi compgenkendisine argüman olarak iletmek daha etkili olabilir (eğer bir önek olduğu biliniyorsa, soruda belirtildiği gibi). Bu durumda, bu olurdu compgen -ac searchstr.
Toby Speight

Aslında ubuntu, 'uygun olmayan hiçbir şey' whatis compgenve 'Manuel giriş yok ' gösterir man compgen.
MarAvFe

1
@MarAvFe: Bunun nedeni, kendi kılavuz bashsayfası ile ayrı bir komut değil, yerleşik bir olmasıdır. bash(1)Kılavuz sayfasını okumanız veya help compgenbir bashkomut satırında çalıştırmanız gerekir .
camh

Uzantı, yapıldığında compgen -c | sort | uniq | lessyinelenen satırlar olmadan kullanılabilir tüm komutları yazdırır ve alfabetik olarak sıralar.
Fabián

39

.Bashrc'ye ekle

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

Ayrıca takma adlar istiyorsanız, o zaman:

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
}

Bu çok yakın ama takma ad içermiyor. Takma adı nasıl ekleyebilirim | sonuçlara -f1 kesin ama sıralama önce?
ack

1
Tek amaç çıktıyı yine de grep üzerinden koymaksa sıralama neden zahmetlidir? Unix felsefesi basit araçlar yapmak ve daha sonra bunları birlikte zincirlemektir, bu nedenle ListAllCommands'tan ayırın ve kullanıcı çıktıyı sıralamak isterse bunu yapabilir.
danio

4
Sıralama, yinelenenleri kaldırmaktır.
Karıncalar Aasma

1
Bu, yürütülebilir dosyalar için sembolik komutlar bulamaz. -LHedeflerine giden simgeleri takip etmek için açık seçeneğini kullanın . Not: -LKomut satırındaki yoldan önce yerleştirilmesi gerektiği için, eşleşen ifadenin parçası olmayan bir seçenektir. Bu durumdafind -L {}
Adaephon

1
Varolmayan dizin uyarılarını bastırmak için STDERR öğesini / dev / null konumuna yönlendirmek isteyebilirsiniz. echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(
Zsh

27

Orada

type -a mycommand

mycommand'ın kullanıldığı $ PATH içindeki tüm diğer adları ve komutları listeleyen komut . Komutun çeşitli varyantlarda var olup olmadığını kontrol etmek için kullanılabilir. Bunun dışında ... Muhtemelen etrafında $ PATH ve tüm diğer adları ayrıştıran bazı scriptler var, ama böyle bir script bilmiyorum.


1
Bu sorunun cevabı olmasa bile, sorunun daha iyi bir çözüm olduğunu düşünüyorum. Böylece -a foo yazabilirsiniz ve foo kullanılamıyorsa, bulunmayan komutu veya bunun gibi bir şeyi döndürür. Böylece, komutun kendisini çağırmadan bir komutu kontrol edebilirsiniz.
Janusz

1
Aslında OP'nin "Aşağıdakileri çalıştırmak ve bir komutun mevcut olup olmadığını görmek istiyorum" diye sorduğu soruya bir cevaptır, bu yüzden amaç bir komutun mevcut olup olmadığını görmek ve bu cevap açıkça işe yarıyor.
lothar

2
@lothar, aradığınız komut neyse, "starterver" ?, "servertart" ?, "server-birşey-yada-other" ise? Biliyorum, sunucu için sadece "grep -i" olacak ve orada olup olmadığına bakacağım. Hata. Bzzz, bu çözümle değil. Matey :-) Bu cevabı oylamayacağım (sınırlı bir şekilde olsa bile yararlı olduğu için) ama tam bir çözüm, grep'in sadece sabit dizeler için değil, düzenli ifadeler için olduğunu dikkate alacaktı .
paxdiablo

6

"Hangi searchstr" i kullanın. İkili dosyanın yolunu veya bir takma adsa takma ad kurulumunu döndürür

Düzenleme: Bir takma ad listesi arıyorsanız şunları kullanabilirsiniz:

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

Bunu hangi PATH aramasının istediğiniz cevaba ekleyin. Bash kullandığınızı varsayar ..


6

Diğerleri komutu gömülü sistemlerde benim için çalışmadı, çünkü bash veya xargs'ın daha eksiksiz bir sürümünü gerektiriyorlar (meşgul kutusu sınırlıydı).

Aşağıdaki komutlar Unix benzeri sistemlerde çalışmalıdır.

Klasöre göre listele:

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

Tüm komutları ada göre listele

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

Bu hala geçerli tr. Neden basit değil ls $(echo ${PATH//:/ })?
mschilli

5

Bu komut dosyasını deneyin:

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

Bu, şimdiye kadar bilinen bir komutun var olup olmadığını görmek için değil, tüm komutlar için bunu yapan tek kod çözümüdür. +1.
paxdiablo

3

Mac kullanıcıları için ( find -executable ve xargs -d içermez):

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

Bunun için teşekkürler. Aslında @AntsAasma yanıt işe yaramadı mac olmayan bir unix kullanıyorum. Bu mac ve benim unix benim için çalışıyor. Üzerinde bulunduğum unix sürümünü belirlemek için hangi komutu yazabilirim, böylece başkalarının sorunumla ilgili olarak yardımcı olması için buraya yanıt verebilirim?
prismaticorb

Linux <corporate_proprietary_build_info_here> Mon 12 Aralık 13:34:16 EST 2011 x86_64 x86_64 x86_64 GNU / Linux
prismaticorb

3

Komutlarla ilişkili anahtar kelimelere dayalı olarak komutları listelemek yararlıdır.

kullanın: man -k "your keyword"

şunlarla birleşmekten çekinmeyin:| grep "another word"

örneğin, bir metin düzenleyici bulmak için: man -k editor | grep text


2

ALT-? (alt ve soru işaretleri aynı anda). Listeyi oluşturmak için bir veya iki saniye verin. Bash'da çalışmalı.


3
Veya boş bir satırın başlangıcında dört kez Esc tuşuna basmayı deneyin.
ephemient

Bu inanılmaz faydalı ve zaten bilmiyordum teşekkürler :-)
Chris Huang-Leaver

2

İşte size tüm yürütülebilir dosyalar ve takma adların bir listesini veren bir çözüm . Aynı zamanda xargs -d(örn. Mac OS X) olmayan sistemlere taşınabilir ve içinde boşluk bulunan yolları düzgün bir şekilde işler.

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

Kullanım: myscript.sh [grep-options] patternörn. Büyük / lsküçük harf duyarlı olmayan ile başlayan tüm komutları bulmak için:

myscript -i ^ls

2

tüm komutları listelemek için kısayol yöntemi. Terminali açın ve iki kez "sekme" düğmesine basın . Terminaldeki tüm komutları göster


1
Ve bunu greptam olarak nasıl yapıyorsun ?
Toby Speight

2

Alternatif olarak, hızlı açıklamalarla birlikte uygun komutların bir listesini alabilirsiniz (komutun bir man sayfası olduğu sürece, en çok olanı vardır):

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

Sonra sadece istediğiniz gibi grep.

apropos -s 1 '' | grep xdg

verim:

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

Sonuçlar sıralı görünmüyor, bu nedenle uzun bir liste arıyorsanız, | sıralama | ve daha sonra / daha az / en çok gibi bir çağrı cihazına bağlayın. ala:

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

Bu, adlarında "zip" olan tüm komutların veya kısa açıklamalarının sıralı bir listesini döndürür ve "daha az" çağrı cihazını pompalar. (Ayrıca "less" yerine $ PAGER yazıp varsayılan çağrı cihazını kullanabilirsiniz.)


1

Her zaman aşağıdakileri yapabilirsiniz:

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

Kabuk yalnızca env var yolunda listelenmişse komutu yürütür.


1

demek istediğim, hangi kabuğu kullandığınıza bağlı. İşte gördüğüm kısıtlamalar:

  1. EDITOR kapsam dışında olsa da, bulabileceğiniz komutları etkileyecek diğer adları, işlevleri ve değişkenleri yakalamak için kabuğunuzla aynı işlemde çalışmalıdır. Bazı şeyleri etkileyebilecek dışa aktarılmamış değişkenleriniz olabilir.
  2. mermiye özgüdür veya çekirdeğe gittiğinizde, / proc / pid / enviorn ve arkadaşlarınız yeterli bilgiye sahip değildir

ZSH kullanıyorum, bu yüzden burada bir zsh cevabı, aşağıdaki 3 şeyi yapar:

  1. döküm yolu
  2. takma ad adları
  3. env içinde döküm işlevleri
  4. onları sıralar

işte burada:

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

Eğer zsh kullanıyorsanız bunu yapmalısınız.


0

Sorun, sekme tamamlamanın yolunuzu aramasıdır, ancak tüm komutlar yolunuzda değildir.

Bash kullanarak yolunuzdaki komutları bulmak için aşağıdakileri yapabilirsiniz:

x in için echo $PATH | cut -d":" -f1; ls $ x yapın; tamam


0

İşte bashrc dosyanıza koyabileceğiniz bir işlev:

işlev komut arama
{
   oldIFS = $ {IFS}
   IFS = ":"

   $ {PATH} içindeki p için
   yapmak
      ls $ p | grep $ 1
   tamam

   dışa aktar IFS = $ {oldIFS}
}

Örnek kullanım:

$ komut arama gnome
gnome-görsel-profilleri-özellikleri *
gnome çıkarma @
gnome-anahtarlığı *
gnome-anahtarlık-cin *
gnome-montaj *
gnome-açık *
gnome ses kayıt cihazı
gnome metin editörü @
gnome-umount @
gnome ses kontrolü *
polkit-gnome provizyon *
vim.gnome *
$

FYI: IFS, bash'ın dizeleri ayırmak için kullandığı bir değişkendir.

Kesinlikle bunu yapmanın daha iyi yolları olabilir.


-1

belki yanlış anlıyorum ama Ekranı Tüm X olasılıklarını gösterene kadar Escape tuşuna basarsanız?


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

1
Bunun ne yaptığı veya nasıl çalışması gerektiği hakkında kısa bir açıklama ekleyin. En azından, önerilen çözümü izlemek ve anlamak için bir referans bağlantısı (genellikle ilgili kılavuz sayfası) belirtin.
TheCodeArtist

Dosya kullanmak her zaman iyi bir seçenek değildir. Gerekirse, en azından bir tmp dosyası yapın (güvenlik bir sorun değilse.)compgen -c > /tmp/list.txt && /tmp/wc list.txt
Gary

-3

Neden sadece yazmıyorsunuz:

seachstr

Terminalde.

Kabuk şöyle diyecektir:

seacrhstr: command not found 

DÜZENLE:

Tamam, aşağı oyu alıyorum, çünkü cevap aptalca, sadece bilmek istiyorum: Bu cevapta sorun var !!! Asker dedi ki:

ve bir komutun mevcut olup olmadığına bakın.

Komutu yazmak size uygun olup olmadığını söyleyecektir !.

Muhtemelen "komutunu yürütmekle" ya da "bir senaryoya dahil etmek" anlamına geliyordu ama fikrini okuyamıyorum (düzenli olarak yapamam, sadece bir zihin okuma saptırıcısı giymesi değil )


4
formathddKomutun var olup olmadığını bilmek istiyorum . Oh bekle, sadece çalıştırıp görüyorum. gee. Teşekkürler :)
Jeffrey Jose

5
Bunu yapmak için 'hangisini' kullanmak muhtemelen daha güvenlidir.
danio

Bunun Süper Kullanıcı değil Yığın Taşması olduğu göz önüne alındığında, programlı bir cevap daha uygun olacaktır.
Toby Speight

-5

debian: ls / bin / | grep "whatImSearchingFor"


1
yürütülebilir dosyalar sadece / bin değil, $ PATH dizinindeki tüm dizinlerde bulunur.
PhrkOnLsh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.