it-swarm.com.de

Listen Sie alle Befehle auf, die eine Shell kennt

Was kann ich in meine Shell eingeben (was zufällig bash ist), um alle erkannten Befehle aufzulisten?

Unterscheidet sich dies auch durch die Shell? Oder haben alle Shells nur ein "Verzeichnis" von Befehlen, die sie erkennen?

Zweitens eine andere Frage, aber wie kann ich eine dieser Fragen überschreiben? Mit anderen Worten, wie kann ich meinen eigenen Befehl view schreiben, um den auf meinem Ubuntu-System vorhandenen zu ersetzen, der anscheinend nur vim lädt.

41
themirror

Sie können compgen verwenden

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

Zu Ihrer Information:

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.
68
Rahul Patil

Eine Shell kennt vier Arten von Befehlen.

  • Aliase: Dies sind Spitznamen für einen Befehl mit einigen Optionen. Sie sind in der Initialisierungsdatei der Shell definiert (~/.bashrc Für Bash).
  • Funktionen: Sie sind Ausschnitte aus Shell-Code, denen ein Name gegeben wurde. Wie Aliase werden sie in der Initialisierungsdatei der Shell definiert.
  • Builtins: Die Shell verfügt über eine kleine Anzahl integrierter Befehle. Die meisten integrierten Funktionen ändern den Shell-Status (cd ändert das aktuelle Verzeichnis, set ändert Optionen und Positionsparameter, export ändert die Umgebung,…). Die meisten Shell bieten weitgehend die gleichen integrierten Funktionen, aber jede Shell verfügt über einige Erweiterungen des Basissatzes.
  • Externe Befehle: Sie sind unabhängig von der Shell. Wie andere Programme führt die Shell externe Programme aus, indem sie sie im ausführbarer Suchpfad nachschlägt. Die Umgebungsvariable PATH enthält eine durch Doppelpunkte getrennte Liste von Verzeichnissen für die Suche nach Programmen.

Falls es Befehle desselben Typs mit demselben Namen gibt, wird die erste Übereinstimmung in der obigen Reihenfolge ausgeführt¹.

Sie können sehen, welcher Art von Befehl ein Name entspricht, indem Sie type some_name Ausführen.

Sie können Aliase auflisten, indem Sie das integrierte alias ohne Argument ausführen. Es gibt keine Möglichkeit, Funktionen oder integrierte Funktionen aufzulisten, die in allen Shells funktionieren. Eine Liste der integrierten Funktionen finden Sie in der Shell-Dokumentation.

In bash listet das integrierte set Funktionen mit ihren Definitionen sowie Variablen auf. In bash, ksh oder zsh listet typeset -f Funktionen mit ihren Definitionen auf. In bash können Sie mit compgen -c Alle Befehlsnamen eines beliebigen Typs auflisten. Mit compgen -A alias, compgen -A builtincompgen -A function Können Sie Befehle eines bestimmten Typs auflisten. Sie können compgen eine zusätzliche Zeichenfolge übergeben, um nur Befehle aufzulisten, die mit diesem Präfix beginnen.

In zsh können Sie die aktuell verfügbaren Befehle eines bestimmten Typs mit echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins} und echo ${(k)commands} (dem letzten) auflisten listet nur externe Befehle auf).

Das folgende Shell-agnostische Snippet listet alle verfügbaren externen Programme auf:

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

In Bash: Hash-Befehlen gibt es einen Edge-Fall.

Bash Reference Manual sagt:

Eine vollständige Suche in den Verzeichnissen in $ PATH wird nur durchgeführt, wenn der Befehl nicht in der Hash-Tabelle gefunden wird

Versuchen:

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

Die Umgebungsvariable PATH enthält nicht ~/dir-for-wat-command, compgen -c Zeigt nicht wat an, aber Sie können wat ausführen.

Wenn Sie einen vorhandenen Befehl schattieren möchten, definieren Sie einen Alias ​​oder eine Funktion .

¹ Ausnahme: Einige Builtins (genannt spezielle Builtins ) können nicht von einer Funktion überschattet werden - bash und zsh entsprechen in diesem Punkt im Standardmodus jedoch nicht POSIX.

Versuchen Sie dies mit bash :

printf '%s\n' ${PATH//:/\/* }
4
Gilles Quenot

Die Befehlsliste besteht aus zwei Sätzen:

  1. Die in die Shell integrierten Befehle
  2. Die Befehle in Ihrem PATH

Sie können die integrierten Funktionen nicht ändern, aber Sie können verhindern, dass die Shell eine integrierte Funktion verwendet, indem Sie den vollständigen Pfadnamen wie /bin/echo Angeben.

Was die Befehle in Ihrem PATH betrifft, können Sie können das ändern. PATH ist eine durch Doppelpunkte getrennte Liste von Verzeichnissen, in denen nach Befehlen gesucht werden soll. Die erste gefundene übereinstimmende Datei "gewinnt".

export PATH=~/bin:${PATH}

(Diese Syntax funktioniert nicht für von csh abgeleitete Shells, sondern für alle anderen, die ich kenne).

Das exportiert PATH mit ~/bin Als erstem Eintrag, gefolgt vom Rest der vorhandenen PATH Einträge. Jetzt überprüft Ihre Shell directory called Bin in your home directory for a command *first* before checking the standard PATH`, den das System eingerichtet hat. Sie können das neue Verzeichnis ganz einfach zuletzt überprüfen lassen, indem Sie stattdessen Folgendes verwenden:

export PATH=${PATH}:~/bin

Um das PATH für zukünftige Anmeldungen beizubehalten, fügen Sie es einer .profile Oder einer anderen Shell-RC-Datei hinzu.

3
kurtm

Wenn Sie zweimal die Tabulatortaste und dann y drücken, wird die Liste aller verfügbaren Befehle in Ihrer aktuellen Shell angezeigt. Für die zweite Frage sollten Sie einen Alias ​​verwenden: Shell-Alias .

1
coffeMug