Czy istnieje „łatwy” sposób uruchomienia polecenia w stylu „ls -la” do wyświetlania wszystkich plików / plików wykonywalnych w bieżącej ścieżce?
(Zamierzam przesłać dane wyjściowe do grep, aby wyszukać polecenia z nieznanymi prefiksami, ale w zasadzie znanymi „nazwami”, rodzaj przypadku, gdy automatyczne uzupełnianie / tabulacja w bashu jest zasadniczo bezużyteczne. Więc coś w rodzaju „odwrotnego automatycznego pełna funkcja „...)
bash
ls
path
autocomplete
sme
źródło
źródło
ls -la
?Odpowiedzi:
źródło
which $(compgen -A function -abck)
?Oto funkcja, która wyświetla zawartość katalogów
$PATH
. Jeśli przekazano argumenty, funkcja wyświetla tylko polecenia, których nazwa zawiera jeden z argumentów. Argumenty są interpretowane jako wzorce globalne.Podobnie jak wiele rzeczy, jest to łatwiejsze w Zsh.
^
Postacią rozszerzalności parametrów powoduje tekst łączone z tablicy być dodawane do każdego elementu tablicy, nppath=(/bin /usr/bin); echo $^path/foo
nadrukami/bin/foo /usr/bin/foo
./*$^@*
wygląda jak obraza z komiksu, ale w rzeczywistości jest zwykłym znakiem/
, symbolem wieloznacznym*
, parametrem specjalnym$@
(tablicą parametru pozycyjnego) z^
modyfikatorem i ponownie*
.(N:t)
jest globalnym kwalifikatoremN
do uzyskania pustego rozszerzenia, jeśli nie ma dopasowania, po którym następuje modyfikator historii,t
aby zachować tylko basename („tail”) każdego dopasowania.Bardziej tajemniczy, pozwala uniknąć połączenia zewnętrznego, ale ma to jedynie znaczenie kosmetyczne:
Być może faktycznie szukasz
apropos
polecenia, które wyszukuje strony podręcznika poleceń, których krótki opis zawiera słowo kluczowe. Ograniczeniem jest to, że znajdują się tylko polecenia, które mają stronę man.źródło
^
wydaje się powodować brak wyjścia dla wywołania „bez argumentów”? Po upuszczeniu możesz wyświetlić je wszystkie i nadal wyszukiwać pojedyncze słowa kluczowe (ale nie ich listę).(Non:t)
Zdaje się mówić, że gwiazdka powinna być rozszerzona? Nie mogłem wymyślić tego ostatniego.path
, ale kiedy uruchamiam go w powłoce, jest to rzeczywiście $ PATH, ale ze spacjami zamiast:
. Reszta jest krystalicznie czysta :)$path
jest funkcją zsh: jest to parametr związany , tablica, która jest automatycznie aktualizowana, gdyPATH
jest aktualizowana i na odwrót.znajdź tylko te pasujące, które: mają ustawiony co najmniej jeden bit „x” (wykonywalny) i nie jest to katalog.
i użyj go z listą wyrażeń regularnych, które można znaleźć:
źródło
echo $PATH | tr ':' '\n' | sort | uniq -d
najpierw odbieramy echo
$PATH
w sed i zamieniamy „:” na „”.następnie szukamy każdej z tych rzeczy, aby znaleźć pliki w rwx i je echo.
2> /dev/null
jest więcfind
nie będzie drukować błędówźródło
-maxdepth 1
a-type f
w swoim znalezisku, w przeciwnym razie znajdziesz podkatalogi i ich pliki (czego nie będzie szukać wyszukiwanie PATH). Poza tym twój test zgody jest dziwny - powinienem+x
pomyśleć?:/bin
lub/bin::/usr/bin
. Spróbuj dodaćs/::/:.:/;s/^:/.:/;s/:$/:./
dosed
polecenia.find
można wyszukiwać więcej ścieżek, więc możesz to zrobić bez pętli:find $(echo $PATH | sed -e 's/\:/\ /g') -perm +rwx …
nazwy katalogów zawierające spacje zepsują go, ale i tak z tym problemem jest taka sama.for
. Zapętli więcfor
listę 4 słów. Manipulować słowem dzielenie lepiej ustawićIFS
w zależności od potrzeb:IFS=':'; find $PATH -perm +rwx …
.