
Was kann ich in meiner Shell (zufällig ist das bash
) eingeben, um alle erkannten Befehle aufzulisten?
Ist das außerdem je nach Shell unterschiedlich? Oder haben alle Shells einfach ein „Verzeichnis“ mit Befehlen, die sie erkennen?
Zweitens, eine andere Frage, aber wie kann ich einen davon überschreiben? Mit anderen Worten, wie kann ich meinen eigenen view
Befehl schreiben, um den auf meinem Ubuntu-System vorhandenen zu ersetzen, der anscheinend nur lädt vim
.
Antwort1
Sie könnencompgen
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.
Antwort2
Eine Shell kennt vier Arten von Befehlen.
- Aliase: Dies sind Spitznamen für einen Befehl mit einigen Optionen. Sie werden in der Initialisierungsdatei der Shell definiert (
~/.bashrc
für Bash). - Funktionen: Dabei handelt es sich um benannte Schnipsel des Shell-Codes. Wie Aliase werden sie in der Initialisierungsdatei der Shell definiert.
- Builtins: Die Shell verfügt über eine kleine Anzahl von Builtins. Die meisten Builtins manipulieren den Shell-Zustand (
cd
ändern das aktuelle Verzeichnis,set
ändern Optionen und Positionsparameter,export
ändern die Umgebung, …). Die meisten Shells bieten weitgehend dieselben Builtins, aber jede Shell hat einige Erweiterungen zum Basissatz. - Externe Befehle: Sie sind unabhängig von der Shell. Wie andere Programme führt die Shell externe Programme aus, indem sie diese imausführbarer Suchpfad. Die
PATH
Umgebungsvariable enthält eine durch Doppelpunkte getrennte Liste von Verzeichnissen, in denen nach Programmen gesucht werden soll.
Falls Befehle mehrerer Typen mit demselben Namen vorhanden sind, wird die erste Übereinstimmung in der obigen Reihenfolge ausgeführt¹.
Sie können sehen, welchem Befehlstyp ein Name entspricht, indem Sie ausführen type some_name
.
Sie können Aliase auflisten, indem Sie das alias
integrierte Programm ohne Argument ausführen. Es gibt keine Möglichkeit, Funktionen oder integrierte Programme aufzulisten, die in allen Shells funktionieren. Eine Liste der integrierten Programme finden Sie in der Dokumentation der Shell.
In Bash listet das set
integrierte Element Funktionen mit ihren Definitionen sowie Variablen auf. In Bash typeset -f
listet KSH oder ZSH Funktionen mit ihren Definitionen auf. In Bash können Sie alle Befehlsnamen beliebigen Typs mit auflisten compgen -c
. Sie können , verwenden compgen -A alias
, compgen -A builtin
compgen -A function
um Befehle eines bestimmten Typs aufzulisten. Sie können eine zusätzliche Zeichenfolge an übergeben, compgen
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 auflisten echo ${(k)commands}
(letzteres listet nur externe Befehle auf).
Der folgende Shell-agnostische Codeausschnitt 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
Es gibt einen Sonderfall in Bash: gehashte Befehle.
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 PATH
Umgebungsvariable enthält nicht ~/dir-for-wat-command
und compgen -c
zeigt nicht an wat
, aber Sie können ausführen wat
.
Wenn Sie einen vorhandenen Befehl spiegeln möchten,Definieren Sie einen Alias oder eine Funktion.
¹ Ausnahme: einige Builtins (sogenanntespezielle Einbauten) kann nicht von einer Funktion überschattet werden – bash und zsh sind in diesem Punkt im Standardmodus jedoch nicht POSIX-kompatibel.
Antwort3
Versuchen Sie dies mitSchlag:
( # usage of a sub processus: the modificaion of PATH variable is local in ( )
PATH+=:EOF # little hack to list last PATH dir
printf '%s\n' ${PATH//:/\/* }
)
Antwort4
Wenn Sie zweimal die Tabulatortaste und dann y drücken, erhalten Sie eine Liste aller verfügbaren Befehle in Ihrer aktuellen Shell. Für die zweite Frage sollten Sie meiner Meinung nach den Alias verwenden:Shell-Alias.