Elencare tutti i comandi che una shell conosce


32

Cosa posso digitare sulla mia shell (che sembra essere bash) che elencherà tutti i comandi che sono riconosciuti?

Inoltre, questo differisce per shell? O tutte le shell hanno solo una "directory" di comandi che riconoscono?

In secondo luogo, domanda diversa, ma come posso ignorare una di quelle? In altre parole, come posso scrivere il mio viewcomando per sostituire quello esistente sul mio sistema Ubuntu, che sembra caricarsi vim.


5
Per favore, non combinare le domande. Pubblica ognuno come una domanda separata.
terdon

Quasi duplicato di unix.stackexchange.com/q/63073/135943 (ho collegato in entrambe le direzioni.)
Wildcard

Risposte:


61

Puoi usarecompgen

compgen -c # will list all the commands you could run.

FYI:

compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.

4
Nota che compgen -cincluderà cose come {o whileche non sono comandi strettamente parlando.
Stéphane Chazelas,

13

Una shell conosce quattro tipi di comandi.

  • Alias: sono soprannomi per un comando con alcune opzioni. Sono definiti nel file di inizializzazione della shell ( ~/.bashrcper bash).
  • Funzioni: sono frammenti di codice shell con un nome. Come gli alias, sono definiti nel file di inizializzazione della shell.
  • Builtins: la shell ha un piccolo numero di comandi integrati. La maggior parte dei builtin manipola lo stato della shell ( cdcambia la directory corrente, setcambia le opzioni e i parametri posizionali, exportcambia l'ambiente, ...). La maggior parte delle shell offre in gran parte gli stessi builtin ma ogni shell ha alcune estensioni al set di base.
  • Comandi esterni: sono indipendenti dalla shell. Come altri programmi, la shell esegue programmi esterni cercandoli nel percorso di ricerca eseguibile . La PATHvariabile di ambiente contiene un elenco separato da due punti di directory per la ricerca di programmi.

Nel caso in cui vi siano comandi di diversi tipi con lo stesso nome, viene eseguita la prima corrispondenza nell'ordine sopra¹.

Puoi vedere a quale tipo di comando corrisponde un nome eseguendo type some_name.

È possibile elencare gli alias eseguendo il aliasbuilt-in senza alcun argomento. Non è possibile elencare funzioni o builtin che funzionano in tutte le shell. È possibile trovare un elenco di builtin nella documentazione della shell.

In bash, il setbuiltin elenca le funzioni con le loro definizioni e variabili. In bash, ksh o zsh, typeset -felenca le funzioni con le loro definizioni. In bash, puoi elencare tutti i nomi dei comandi di qualsiasi tipo con compgen -c. È possibile utilizzare compgen -A alias, compgen -A builtin compgen -A functionper elencare i comandi di un tipo specifico. È possibile passare una stringa aggiuntiva compgenper elencare solo i comandi che iniziano con quel prefisso.

In zsh, è possibile elencare i comandi attualmente disponibili di un determinato tipo con echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins}e echo ${(k)commands}(solo che l'ultimo elenca i comandi esterni).

Il seguente frammento di shell-agnostico elenca tutti i programmi esterni disponibili:

case "$PATH" in
  (*[!:]:) PATH="$PATH:" ;;
esac

set -f; IFS=:
for dir in $PATH; do
  set +f
  [ -z "$dir" ] && dir="."
  for file in "$dir"/*; do
    if [ -x "$file" ] && ! [ -d "$file" ]; then
      printf '%s = %s\n' "${file##*/}" "$file"
    fi
  done
done

C'è un caso limite in Bash: comandi con hash.

Il manuale di riferimento di Bash dice:

Una ricerca completa delle directory in $ PATH viene eseguita solo se il comando non viene trovato nella tabella hash

Provare:

set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat

La PATHvariabile d'ambiente non contiene ~/dir-for-wat-command, compgen -cnon mostra wat, ma puoi eseguirla wat.

Se si desidera ombreggiare un comando esistente, definire un alias o una funzione .

¹ Eccezione: alcuni builtin (chiamati builtins speciali ) non possono essere ombreggiati da una funzione - bash e zsh non sono conformi a POSIX su quel punto nella loro modalità predefinita.


Un altro caso limite è per valori di $PATHlike /bin:/usr/bin:(trailing :), in cui non è possibile elencare i file eseguibili nella directory corrente.
Stéphane Chazelas,

3

L'elenco dei comandi è costituito da due set:

  1. I comandi integrati nella shell
  2. I comandi nel tuo PATH

Non è possibile modificare i built-in, ma è possibile impedire alla shell di utilizzare un built-in specificando il percorso completo come /bin/echo.

Per quanto riguarda i comandi nel tuo PATH, puoi cambiarlo. PATHè un elenco separato da due punti di directory in cui cercare i comandi. Il primo file corrispondente trovato "vince".

export PATH=~/bin:${PATH}

(Questa sintassi non funziona per le cshshell con esperienza, ma per tutte le altre che conosco).

Che esporta PATHcon ~/bincome prima voce seguito dal resto delle attuali PATHvoci. Così ora la shell controllerà directory calledbin in your home directory for a command *first* before checking the standardpath` il sistema istituito. Puoi facilmente farlo controllare per ultimo la nuova directory usando invece:

export PATH=${PATH}:~/bin

Per rendere PATHpersistente per accessi futuri, aggiungerlo a uno .profileo altri file shell rc.



1

Se premi due volte il tasto Tab e poi y, otterrai l'elenco di tutti i comandi disponibili nella tua shell corrente. Per la seconda domanda penso che dovresti usare alias: shell alias .


per quanto riguarda l'alias, è un modo infallibile di sovrascrivere e non sovrascrivere ("unaliasing") un comando quando viene chiamato in qualsiasi punto del sistema (ad esempio da uno script di shell)?
themirror

1
Che shell usi? Non riesco a visualizzare la doppia scheda per elencare tutti i comandi su bash.
terdon

Uso bash su Ubuntu 13.04. C'è anche un comando chiamato compgen che può essere usato per ottenere l'elenco di tutti i comandi disponibili su bash.
coffeMug

@terdon Hai installato il completamento bash?
coffeMug

1
set show-all-if-
ambiguous
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.