Gibt es einen Einzeiler, der alle ausführbaren Dateien von $ PATH in bash auflistet?
bash
shell
path
executable
jcubic
quelle
quelle
in
,{
...) und Aliase.Mit zsh:
Oder:
(Beachten Sie, dass bei Befehlen, die in mehr als einer Komponente von vorkommen
$PATH
, nur die erste aufgeführt wird.)Wenn Sie die Befehle ohne die vollständigen Pfade und nach guten Maßen sortiert haben möchten:
(Das heißt, erhalten Sie die Schlüssel dieses assoziativen Arrays anstelle der Werte).
quelle
In jeder POSIX-Shell, ohne einen externen Befehl zu verwenden (vorausgesetzt, es
printf
ist eine Funktion integriert, auf die nicht zurückgegriffen wirdecho
), mit Ausnahme der endgültigen Sortierung und unter der Annahme, dass kein ausführbarer Name eine neue Zeile enthält:Wenn Sie keine leere Komponente in
$PATH
(.
stattdessen verwenden) oder Komponenten haben, die mit beginnen-
, oder Platzhalterzeichen\[?*
in PATH-Komponenten oder ausführbaren Namen und keine ausführbaren Dateien, die mit beginnen.
, können Sie dies folgendermaßen vereinfachen:Verwendung von POSIX
find
undsed
:Wenn Sie bereit sind, die seltene nicht ausführbare Datei oder die nicht reguläre Datei im Pfad aufzulisten, gibt es einen viel einfacheren Weg:
Dadurch werden Punktdateien übersprungen. Wenn Sie sie brauchen, fügen Sie die
-A
Flagge hinzu,ls
wenn Sie sie haben oder wenn Sie sich an POSIX halten möchten:ls -aH $PATH | grep -Fxv -e . -e ..
Es gibt einfachere Lösungen in bash und in zsh .
quelle
$PATH
das gesetzt ist und keine leeren Komponenten enthält und dass Komponenten nicht wie Prädikate (oder ls-Optionen) aussehen. Einige davon ignorieren auch Punktdateien.yash
undzsh
in sh Emulation).find
.-prune
verhindert das Auflisten von Verzeichnissen. Sie möchten wahrscheinlich-L
statt-H
wie Sie möchten Symlinks (gemeinsam für ausführbare Dateien) enthalten.-perm -100
gibt keine Garantie dafür, dass die Datei von Ihnen ausführbar ist (und möglicherweise (unwahrscheinlich) ausführbare Dateien ausschließt).Das habe ich mir ausgedacht:
BEARBEITEN : Es scheint, dass dies der einzige Befehl ist, der beim Lesen einiger Dateien im bin-Verzeichnis durch einen Apache-Benutzer keine SELinux-Warnung auslöst.
quelle
for
?IFS=:; find $PATH -maxdepth 1 -executable -type f -printf '%f\n'
$PATH
gesetzt ist und keine Platzhalterzeichen und keine leeren Komponenten enthält. Das setzt auch die GNU-Implementierung von vorausfind
.-type f
anstelle von (GNU-spezifisch)-xtype f
werden auch Symlinks weggelassen. Dadurch wird auch nicht der Inhalt von$PATH
Komponenten aufgelistet, bei denen es sich um Symlinks handelt.Wie wäre es damit
Die Zeichenfolgensubstitution wird mit Bash verwendet.
quelle
$PATH
gesetzt ist, keine Platzhalter oder Leerzeichen enthält, keine leeren Komponenten enthält. Das setzt voraus, dass GNU auch findet. Beachten Sie, dass dies${var//x/y}
dieksh
Syntax ist (wird auch von zsh und bash unterstützt). Genau genommen setzt dies auch voraus, dass $ PATH-Komponenten auch keinefind
Prädikate sind.$PATH
Komponenten keine Symlinks sind.IFS=:
ist robuster als diese Ersetzung. Pfade mit Leerzeichen sind unter Windows keine Seltenheit. Symbolische Verknüpfungen sind weit verbreitet, aber das lässt sich leicht lösen-H
.Wenn Sie Python in Ihrer Shell ausführen können, kann auch der folgende (lächerlich lange) Einzeiler verwendet werden:
Dies war für mich meistens eine lustige Übung, um herauszufinden, ob es mit einer einzigen Zeile Python-Code möglich ist, ohne die Funktion 'exec' zu verwenden. In einer besser lesbaren Form und mit einigen Kommentaren sieht der Code folgendermaßen aus:
quelle
quelle