Comando Linux per elencare tutti i comandi e gli alias disponibili


280

Esiste un comando Linux che elencherà tutti i comandi e gli alias disponibili per questa sessione terminale?

Come se avessi digitato 'a' e premuto tab, ma per ogni lettera dell'alfabeto. O eseguendo 'alias' ma restituendo anche comandi.

Perché? Vorrei eseguire quanto segue e vedere se è disponibile un comando:

ListAllCommands | grep searchstr

premere due volte il tasto TAB per elencare tutti i comandi disponibili con l'ambiente
ntshetty

Risposte:


599

Puoi usare il bash (1) integrato compgen

  • compgen -c elencherà tutti i comandi che potresti eseguire.
  • compgen -a elencherà tutti gli alias che potresti eseguire.
  • compgen -b elencherà tutti i built-in che potresti eseguire.
  • compgen -k elencherà tutte le parole chiave che potresti eseguire.
  • compgen -A function elencherà tutte le funzioni che potresti eseguire.
  • compgen -A function -abck elencherà tutto quanto sopra in una volta sola.

Controlla la pagina man per altri completamenti che puoi generare.

Per rispondere direttamente alla tua domanda:

compgen -ac | grep searchstr

dovrebbe fare quello che vuoi.


1
Esiste un equivalente a questo per csh / tcsh? Quei terminali hanno anche una sorta di funzione di completamento automatico utilizzata nella scheda, quindi forse esiste qualcosa?
krb686,

2
Invece di compgen | grep, può essere più efficiente passare la stringa come argomento a compgense stessa (se è noto che è un prefisso, come implicito nella domanda). In questo caso, sarebbe compgen -ac searchstr.
Toby Speight,

In realtà, Ubuntu mostra 'nulla di appropriato' whatis compgene 'Nessuna immissione manuale' per man compgen.
MarAvFe,

1
@MarAvFe: Questo perché è un bashcomando incorporato, non separato con una propria pagina man. Dovrai leggere la bash(1)pagina man o eseguire help compgenda una bashriga di comando.
Camh,

Per estensione, facendo compgen -c | sort | uniq | lessverranno stampati tutti i comandi disponibili senza linee duplicate e ordinati alfabeticamente.
Fabián,

39

Aggiungi a .bashrc

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

Se vuoi anche degli alias, allora:

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
}

Questo è molto vicino ma non include gli alias. Come posso aggiungere l'alias | tagliare -f1 ai risultati ma prima dell'ordinamento?
ack

1
Perché preoccuparsi dell'ordinamento se l'unico scopo è quello di mettere l'output attraverso grep comunque? La filosofia di Unix è quella di creare strumenti semplici e poi metterli insieme se necessario, quindi lasciare l'ordinamento fuori da ListAllCommands e se l'utente desidera che l'output sia ordinato, può farlo.
danio,

4
L'ordinamento è rimuovere i duplicati.
Ants Aasma,

1
Questo non trova i comandi che sono collegamenti simbolici agli eseguibili. Utilizzare l'opzione -Lon per seguire i collegamenti simbolici alla loro destinazione. Nota: -Lè un'opzione e non fa parte dell'espressione corrispondente, pertanto deve essere posizionata prima del percorso sulla riga di comando. In questo casofind -L {}
Adaephon

1
Potrebbe voler reindirizzare STDERR su / dev / null per eliminare gli avvisi di directory inesistenti. echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(+1 per la compatibilità zsh)
TheLonelyGhost

27

c'è il

type -a mycommand

comando che elenca tutti gli alias e i comandi in $ PATH in cui viene utilizzato mycommand . Può essere utilizzato per verificare se il comando esiste in diverse varianti. A parte questo ... Probabilmente c'è qualche script in giro che analizza $ PATH e tutti gli alias, ma non è a conoscenza di nessuno di questi script.


1
Anche se non è una risposta alla domanda, penso che sia una soluzione migliore al problema, quindi la chiamata a grep. Quindi puoi fare -a foo e se foo non è disponibile restituisce il comando non trovato o qualcosa del genere. Quindi sei in grado di controllare un comando senza chiamare il comando stesso.
Janusz,

1
In realtà si tratta di una risposta alla domanda, poiché l'OP ha chiesto "Vorrei eseguire quanto segue e vedere se un comando è disponibile", quindi lo scopo è vedere se un comando è disponibile e questa risposta funziona chiaramente.
lothar,

2
@lothar, cosa succede se il comando che stai cercando è, uh, che cos'è stato, "openserver" ?, "serverstart" ?, "server-qualcosa-o-altro" ?. Lo so, mi limiterò a "grep -i" per server e vedere se è lì. Ops. Bzzz, non con questa soluzione. matey :-) Non voterò questa risposta (poiché è utile anche se in modo limitato) ma una soluzione completa prenderebbe in considerazione che grep è per le espressioni regolari , non solo per le stringhe fisse.
paxdiablo,

6

Usa "quale searchstr". Restituisce il percorso dell'installazione binaria o alias se è un alias

Modifica: se stai cercando un elenco di alias, puoi utilizzare:

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

Aggiungilo a qualunque PATH cerca la risposta che ti piace. Supponiamo che tu stia usando bash ..


6

Il comando degli altri non ha funzionato per me sui sistemi embedded, perché richiedono bash o una versione più completa di xargs (busybox era limitato).

I seguenti comandi dovrebbero funzionare su qualsiasi sistema simile a Unix.

Elenco per cartella:

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

Elenca tutti i comandi per nome

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

Questo si basa ancora tr. Perché non semplicemente ls $(echo ${PATH//:/ })?
mschilli,

5

Prova questo script:

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

Questa è l'unica soluzione di codice finora che lo fa per tutti i comandi, non solo per vedere se esiste un dato comando noto. +1.
paxdiablo,

3

Per utenti Mac ( find non ha -executable e xargs non ha -d):

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

Grazie per questo. In realtà sto usando un unix non mac in cui la risposta di @AntsAasma non ha funzionato. Questo funziona anche per me su Mac e anche per il mio unix. Quale comando posso digitare per determinare la versione di unix in cui mi trovo, così posso rispondere qui per aiutare gli altri a risolvere il mio problema?
prismaticorb,

Linux <corporate_proprietary_build_info_here> Lun 12 dic 13:34:16 EST 2011 x86_64 x86_64 x86_64 GNU / Linux
prismaticorb

3

È utile elencare i comandi in base alle parole chiave associate al comando.

Uso: man -k "your keyword"

sentiti libero di combinare con:| grep "another word"

ad esempio, per trovare un editor di testo: man -k editor | grep text


2

Prova a premere ALT-? (alt e punto interrogativo allo stesso tempo). Dagli un secondo o due per compilare l'elenco. Dovrebbe funzionare in bash.


3
Oppure prova a colpire Esc all'inizio di una riga vuota quattro volte.
effimero

È incredibilmente utile e non lo sapevo già grazie :-)
Chris Huang-Leaver

2

Ecco una soluzione che ti fornisce un elenco di tutti gli eseguibili e gli alias. È anche portabile su sistemi senza xargs -d(ad esempio Mac OS X) e gestisce correttamente i percorsi con spazi all'interno.

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

Utilizzo: myscript.sh [grep-options] patternad es. Per trovare tutti i comandi che iniziano con ls, senza distinzione tra maiuscole e minuscole, eseguire:

myscript -i ^ls

2

metodo di scelta rapida per elencare tutti i comandi. Aprire il terminale e premere due volte il tasto "tab" . Questo mostra tutti i comandi nel terminale


1
E lo dirigi grepesattamente come?
Toby Speight,

2

In alternativa, puoi ottenere un comodo elenco di comandi abbinato a descrizioni rapide (purché il comando abbia una pagina man, cosa che la maggior parte fa):

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

Quindi lo fai semplicemente come vuoi.

apropos -s 1 '' | grep xdg

rendimenti:

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

I risultati non sembrano essere ordinati, quindi se stai cercando un lungo elenco, puoi lanciare un | ordina | nel mezzo, quindi reindirizzarlo a un cercapersone come less / more / most. ala:

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

Che restituisce un elenco ordinato di tutti i comandi che hanno "zip" nel loro nome o nella loro breve descrizione, e pompa quel cercapersone "meno". (Puoi anche sostituire "less" con $ PAGER e utilizzare il cercapersone predefinito.)


1

Puoi sempre:

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

La shell eseguirà il comando solo se sono comunque elencati nel percorso env var.


1

dipende, voglio dire che dipende da quale shell stai usando. ecco i vincoli che vedo:

  1. deve essere eseguito nello stesso processo della shell, per catturare alias, funzioni e variabili che influenzerebbero i comandi che puoi trovare, pensa PATH o EDITOR anche se EDITOR potrebbe essere fuori portata. Puoi avere variabili non esportate che possono influenzare le cose.
  2. è specifico della shell o stai andando nel kernel, / proc / pid / enviorn e gli amici non hanno abbastanza informazioni

Uso ZSH quindi ecco una risposta zsh, fa le seguenti 3 cose:

  1. percorso delle discariche
  2. scarica i nomi degli alias
  3. scarica le funzioni che si trovano nell'ambiente
  4. li ordina

Ecco qui:

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

Se usi zsh questo dovrebbe farlo.


0

Il problema è che il completamento della scheda sta cercando il tuo percorso, ma tutti i comandi non sono nel tuo percorso.

Per trovare i comandi nel tuo percorso usando bash potresti fare qualcosa del tipo:

per x in echo $PATH | cut -d":" -f1; fai $ x; fatto


0

Ecco una funzione che puoi inserire nel tuo file bashrc:

funzione command-search
{
   oldIFS = $ {} IFS
   IFS = ":"

   per p in $ {PATH}
   fare
      $ p | grep $ 1
   fatto

   export IFS = $ {oldIFS}
}

Esempio di utilizzo:

$ command-search gnome
gnome-audio-profiles-proprietà *
gnome-espulsione @
gnome-keyring *
gnome-keyring-daemon *
gnome-mount *
gnome-open *
gnome-sound-recorder *
gnome-editor di testo @
gnome-umount @
gnome-volume-control *
polkit-gnome-autorizzazione *
vim.gnome *
$

FYI: IFS è una variabile che bash usa per dividere le stringhe.

Certamente ci potrebbero essere dei modi migliori per farlo.


-1

forse sto fraintendendo, ma cosa succede se si preme Esc fino a quando non si ottiene la possibilità di visualizzare tutte le X?


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

1
Considera di aggiungere una breve descrizione di ciò che fa o di come dovrebbe funzionare. Per lo meno, specificare un collegamento di riferimento (di solito la pagina man pertinente) per dare seguito e comprendere la soluzione proposta.
TheCodeArtist

L'uso di un file non è sempre una buona opzione. Se è necessario, almeno renderlo un file tmp (se la sicurezza non è un problema.)compgen -c > /tmp/list.txt && /tmp/wc list.txt
Gary

-3

Perché non scrivi semplicemente:

seachstr

Nel terminale

La shell dirà qualcosa di simile

seacrhstr: command not found 

MODIFICARE:

Ok, prendo il voto negativo, perché la risposta è stupida, voglio solo sapere: cosa c'è che non va in questa risposta !!! Il richiedente ha detto:

e vedere se è disponibile un comando.

Digitando il comando ti dirà se è disponibile !.

Probabilmente intendeva "senza eseguire il comando" o "includerlo in uno script" ma non riesco a leggere la sua mente (non è che non posso regolarmente è solo che indossa un deflettore per la lettura della mente )


4
Voglio sapere se formathddesiste un comando. Oh aspetta, devo solo eseguirlo e vedere. Gee. Grazie :)
Jeffrey Jose,

5
Probabilmente è più sicuro usare "che" per farlo.
danio,

Dato che si tratta di Stack Overflow , non di Super User , una risposta programmatica sarebbe più appropriata.
Toby Speight,

-5

in debian: ls / bin / | grep "whatImSearchingFor"


1
gli eseguibili esistono in tutte le directory in $ PATH, non solo / bin.
PhrkOnLsh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.