Wyświetl wszystkie polecenia znane powłoce

32

Co mogę wpisać w mojej powłoce (która tak się składa bash), która wyświetli wszystkie rozpoznane polecenia?

Czy to też różni się powłoką? Czy też wszystkie powłoki mają po prostu „katalog” rozpoznawanych poleceń?

Po drugie, inne pytanie, ale jak mogę je pominąć? Innymi słowy, jak mogę napisać własne viewpolecenie, aby zastąpić polecenie istniejące w moim systemie Ubuntu, które wydaje się po prostu ładować vim.

lustro
źródło
5
Proszę nie łączyć pytań. Opublikuj każdy jako osobne pytanie.
terdon
Prawie duplikat unix.stackexchange.com/q/63073/135943 (połączyłem w obu kierunkach.)
Wildcard

Odpowiedzi:

61

Możesz użyćcompgen

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.
Rahul Patil
źródło
4
Należy pamiętać, że compgen -cbędzie to takie rzeczy {lub whilektóre nie są ściśle mówiąc poleceń.
Stéphane Chazelas
13

Powłoka zna cztery rodzaje poleceń.

  • Aliasy: są to pseudonimy dla polecenia z pewnymi opcjami. Są zdefiniowane w pliku inicjującym powłoki ( ~/.bashrcdla bash).
  • Funkcje: są to fragmenty kodu powłoki o nazwie. Podobnie jak aliasy, są one zdefiniowane w pliku inicjalizacji powłoki.
  • Wbudowane: powłoka zawiera niewielką liczbę wbudowanych poleceń. Większość wbudowanych manipuluje stanem powłoki ( cdzmienia bieżący katalog, setzmienia opcje i parametry pozycyjne, exportzmienia środowisko,…). Większość powłok oferuje w dużej mierze te same wbudowane elementy, ale każda powłoka ma kilka rozszerzeń zestawu podstawowego.
  • Polecenia zewnętrzne: są niezależne od powłoki. Podobnie jak inne programy, powłoka wykonuje programy zewnętrzne, wyszukując je w ścieżce wyszukiwania wykonywalnego . PATHZmienna zawiera oddzieloną dwukropkami listę katalogów do wyszukiwania programów.

W przypadku poleceń kilku typów o tej samej nazwie, wykonywane jest pierwsze dopasowanie w powyższej kolejności¹.

Możesz zobaczyć, jaki typ polecenia odpowiada nazwie, uruchamiając type some_name.

Możesz wyświetlić listę aliasów, uruchamiając aliaswbudowany bez argumentów. Nie ma sposobu, aby wyświetlić listę funkcji lub wbudowanych funkcji, które działają we wszystkich powłokach. Możesz znaleźć listę wbudowanych w dokumentacji powłoki.

W bash setwbudowane listy funkcji z ich definicjami, a także zmiennymi. W bash, ksh lub zsh typeset -fwyświetla funkcje z ich definicjami. W bash możesz wyświetlić listę wszystkich nazw poleceń dowolnego typu compgen -c. Możesz użyć compgen -A alias, compgen -A builtin compgen -A functionaby wyświetlić listę poleceń określonego typu. Możesz przekazać dodatkowy ciąg znaków, aby compgenwyświetlić tylko polecenia rozpoczynające się od tego prefiksu.

W zsh, można wymienić aktualnie dostępne polecenia danego typu z echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins}i echo ${(k)commands}(ten ostatni wymienia tylko poleceń zewnętrznych).

Poniższy fragment kodu niezależny od powłoki zawiera listę wszystkich dostępnych programów zewnętrznych:

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

W poleceniach Bash: hashed występuje wielkość liter.

Bash Reference Manual mówi:

Pełne wyszukiwanie katalogów w $ PATH jest wykonywane tylko wtedy, gdy polecenia nie znaleziono w tabeli skrótów

Próbować:

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

PATHZmienna nie zawiera ~/dir-for-wat-command, compgen -cnie pokazuje wat, ale można uruchomić wat.

Jeśli chcesz ukryć istniejące polecenie, zdefiniuj alias lub funkcję .

¹ Wyjątek: kilka wbudowanych funkcji (zwanych wbudowanymi specjalnymi ) nie może być przesłanianych przez funkcję - jednak bash i zsh nie są zgodne z POSIX w tym punkcie w trybie domyślnym.

Gilles „SO- przestań być zły”
źródło
Innym przypadkiem na krawędzi jest wartość $PATHpodobna /bin:/usr/bin:(końcowa :), w której nie można wyświetlić plików wykonywalnych w bieżącym katalogu.
Stéphane Chazelas
3

Lista poleceń składa się z dwóch zestawów:

  1. Polecenia wbudowane w powłokę
  2. Polecenia w twoim PATH

Nie możesz zmieniać wbudowanych, ale możesz powstrzymać powłokę przed użyciem wbudowanych, określając pełną nazwę ścieżki jak /bin/echo.

Jeśli chodzi o polecenia w twoim PATH, możesz to zmienić. PATHto rozdzielona dwukropkami lista katalogów, w których można szukać poleceń. Pierwszy znaleziony plik „wygrywa”.

export PATH=~/bin:${PATH}

(Ta składnia nie działa w przypadku cshpowłok pochodzących od, ale dla wszystkich innych, o których wiem).

Że eksport PATHz ~/binjako pierwszy wpis, a następnie przez resztę istniejących PATHwpisów. Więc teraz twoja powłoka sprawdzi directory calledbin in your home directory for a command *first* before checking the standardPATH` skonfigurowanego systemu. Możesz łatwo sprawić, by sprawdził ostatnio nowy katalog, zamiast tego używając:

export PATH=${PATH}:~/bin

Aby zachować PATHdla przyszłych logowań, dodaj go do .profilelub innego pliku rc powłoki.

kurtm
źródło
2

Spróbuj tego, używając :

printf '%s\n' ${PATH//:/\/* }
Gilles Quenot
źródło
1

Jeśli naciśniesz klawisz tab dwa razy, a następnie y, otrzymasz listę wszystkich dostępnych poleceń w bieżącej powłoce. W przypadku drugiego pytania myślę, że powinieneś użyć aliasu: alias powłoki .

kubek kawy
źródło
jeśli chodzi o alias, czy jest to niezawodny sposób na przesłonięcie i usunięcie (przez „odblokowanie”) polecenia, gdy jest ono wywoływane w dowolnym miejscu w systemie (na przykład ze skryptu powłoki)?
poniedziałek,
1
Jakiej powłoki używasz? Nie mogę uzyskać podwójnej karty, aby wyświetlić listę wszystkich poleceń w moim bashu.
terdon
Używam bash na Ubuntu 13.04. Istnieje również polecenie o nazwie compgen, którego można użyć do uzyskania listy wszystkich dostępnych poleceń w bashu.
coffeMug
@terdon Czy masz zainstalowane zakończenie bash?
coffeMug
1
ustaw show-all-if-ambiguous off
coffeMug