Hier ist eine Funktion, die den Inhalt der Verzeichnisse auflistet $PATH
. Wenn Argumente übergeben werden, listet die Funktion nur Befehle auf, deren Name eines der Argumente enthält. Die Argumente werden als Glob-Muster interpretiert.
shopt -s extglob
lspath () {
local IFS pattern
IFS='|'
pattern="*@($*)*"
IFS=':'
for d in $PATH; do
for x in "$d/"$pattern; do
[ "$x" = "$d/$pattern" ] || echo "${x##*/}"
done
done | sort -u
}
Wie viele Dinge ist dies in zsh einfacher.
lspath () {
(($#)) || set ''
print -lr -- $^path/*$^@*(N:t) | sort -u
}
Das ^
Zeichen in der Parametererweiterung bewirkt, dass der mit dem Array verkettete Text zu jedem Array-Element hinzugefügt wird, z . B. path=(/bin /usr/bin); echo $^path/foo
Ausdrucke /bin/foo /usr/bin/foo
.
/*$^@*
sieht aus wie eine Comic-Beleidigung, ist aber tatsächlich das gewöhnliche Zeichen /
, der Platzhalter *
, der spezielle Parameter $@
(das Array der Positionsparameter) mit dem ^
Modifikator und wieder *
.
(N:t)
ist das Glob-Qualifikationsmerkmal N
, um eine leere Erweiterung zu erhalten, wenn keine Übereinstimmung vorliegt t
, gefolgt vom Verlaufsmodifikator , um nur den Basisnamen ("Schwanz") jeder Übereinstimmung beizubehalten.
Kryptischer, vermeidet den externen Anruf, aber dies ist nur von kosmetischem Interesse:
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
Möglicherweise suchen Sie tatsächlich nach dem apropos
Befehl, der nach Manpages von Befehlen sucht, deren Kurzbeschreibung ein Schlüsselwort enthält. Eine Einschränkung besteht darin, dass nur Befehle gefunden werden, die eine Manpage haben.
ls -la
?