Czy istnieje jedna linijka, która wyświetli wszystkie pliki wykonywalne z $ PATH w bash.
bash
shell
path
executable
jcubic
źródło
źródło
in
,{
...) i aliasy.Z zsh:
Lub:
(zwróć uwagę, że w przypadku poleceń, które występują w więcej niż jednym składniku
$PATH
, będą one wyświetlać tylko pierwszy).Jeśli chcesz, aby polecenia nie zawierały pełnych ścieżek i zostały posortowane dla zachowania dokładności:
(to znaczy pobierz klucze z tej tablicy asocjacyjnej zamiast wartości).
źródło
W dowolnej powłoce POSIX, bez użycia zewnętrznego polecenia (przy założeniu, że
printf
jest wbudowane, jeśli nie cofnij sięecho
), z wyjątkiem końcowego sortowania i zakładając, że żadna nazwa pliku wykonywalnego nie zawiera nowej linii:Jeśli nie masz pustego komponentu
$PATH
(użyj.
zamiast niego) ani komponentów rozpoczynających się od-
, ani symboli wieloznacznych ani\[?*
w komponentach PATH, ani w nazwach plików wykonywalnych, i żadnych plików wykonywalnych zaczynających się od.
, możesz uprościć to w celu:Korzystanie z POSIX
find
ised
:Jeśli chcesz podać w ścieżce rzadki plik niewykonywalny lub plik nieregularny, istnieje o wiele prostszy sposób:
Pomija to pliki kropkowe; jeśli ich potrzebujesz, dodaj
-A
flagęls
, jeśli masz ją lub jeśli chcesz trzymać się POSIX:ls -aH $PATH | grep -Fxv -e . -e ..
Istnieją prostsze rozwiązania w bash i w zsh .
źródło
$PATH
jest ustawiony i nie zawiera pustych komponentów i że komponenty nie wyglądają jak znajdź predykaty (lub opcje ls). Niektóre z nich będą również ignorować pliki kropek.yash
izsh
emulacji).find
drugim.-prune
zapobiegnie wyświetlaniu katalogów. Prawdopodobnie chcesz-L
zamiast-H
jak chcesz dołączyć dowiązania symboliczne (wspólne dla plików wykonywalnych).-perm -100
nie daje gwarancji, że plik będzie wykonywalny przez Ciebie (i może (mało prawdopodobne) wykluczyć pliki wykonywalne).Wymyśliłem to:
EDYCJA : Wydaje się, że jest to jedyne polecenie, które nie wyzwala alertu SELinux podczas odczytywania niektórych plików w katalogu bin przez użytkownika apache.
źródło
for
?IFS=:; find $PATH -maxdepth 1 -executable -type f -printf '%f\n'
$PATH
jest ustawiony i nie zawiera symboli wieloznacznych oraz nie zawiera pustych składników. To zakłada również implementację GNUfind
.-type f
zamiast (specyficzne dla GNU)-xtype f
, to również pominie dowiązania symboliczne. To również nie wyświetli zawartości$PATH
składników, które są dowiązaniami symbolicznymi.Co powiesz na to
Podstawienie łańcucha jest używane z Bash.
źródło
$PATH
jest ustawiony, nie zawiera symboli wieloznacznych ani pustych znaków, nie zawiera pustych składników. To zakłada także GNU find. Zauważ, że${var//x/y}
jest toksh
składnia (obsługiwana także przez zsh i bash). Ściśle mówiąc, zakłada to również, że składniki $ PATH również nie sąfind
predykatami.$PATH
komponenty nie są dowiązaniami symbolicznymi.IFS=:
jest bardziej niezawodne niż wykonywanie tej zamiany. Ścieżki ze spacjami nie są tak rzadkie w systemie Windows. Dowiązania symboliczne są dość powszechne, ale można je łatwo rozwiązać-H
.Jeśli możesz uruchomić Pythona w swojej powłoce, możesz również użyć następującej (absurdalnie długiej) jednowarstwowej:
Było to głównie zabawne ćwiczenie dla mnie, aby sprawdzić, czy można to zrobić za pomocą jednego wiersza kodu Pythona bez uciekania się do korzystania z funkcji „exec”. W bardziej czytelnej formie i z pewnymi komentarzami kod wygląda następująco:
źródło
źródło