Dokumentacja Bash stwierdza: „W prawie każdym celu funkcje powłoki są lepsze niż aliasy”. Oto funkcja powłoki, która zastępuje lsi powoduje przesyłanie danych wyjściowych, morejeśli argument składa się z (tylko) -la.
ls(){if[[ $@ =="-la"]];then
command ls -la | more
else
command ls "$@"fi}
Jako jedna linijka:
ls(){if[[ $@ =="-la"]];then command ls -la | more;else command ls "$@";fi;}
Pierwsze słowo każdego prostego polecenia, jeśli nie jest cytowane, jest sprawdzane pod kątem aliasu. Jeśli tak, to słowo jest zastępowane tekstem aliasu. Nazwa aliasu i tekst zastępujący mogą zawierać dowolne prawidłowe dane wejściowe powłoki, w tym metaznaki powłoki, z wyjątkiem tego, że nazwa aliasu nie może zawierać `= '.
Tak więc tylko pierwsze słowo jest sprawdzane pod kątem dopasowania aliasów, co uniemożliwia aliasy wielowyrazowe. Możesz być w stanie napisać skrypt powłoki, który sprawdza argumenty i wywołuje twoje polecenie, jeśli są zgodne, a w przeciwnym razie po prostu wywołuje normalne ls(patrz odpowiedź @Dennis Williamson )
+1 Za wyjaśnienie, dlaczego nie wolno mi używać ls -la jako aliasu.
sixtyfootersdude
7
Było to pomocne, ponieważ zamiast próbować go rozwiązać, odpowiedział na pytanie. Przybyłem tutaj, ponieważ chciałem stworzyć alias ze spacją, a to po prostu się nie stanie.
angryundead
To nie tylko odpowiedziało na moje pytanie, ale dało mi cenny wgląd w to, jak naprawdę działa mechanizm aliasingu. Twój cytat ze strony podręcznika był bardzo pomocny.
Lily Finley
14
Nieco ulepszone podejście zaczerpnięte z odpowiedzi Dennisa:
function ls(){case $*in-la*) shift 1; command ls -la "$@"| more ;;*) command ls "$@";;esac}
Lub liniowiec:
function ls(){case $*in-la*) shift 1; command ls -la "$@"| more ;;*) command ls "$@";;esac}
Pozwala to na przykład dołączyć dodatkowe opcje / argumenty po komendzie, jeśli to konieczne ls -la -h
Jak sobie z tym poradzić, jeśli chcę ls -latzostać wykluczony z tego leczenia? Musiałbym postawić skrzynkę, aby poradzić sobie z tym nad -la*wpisem, tak?
Steven Lu
-1
Możesz nadal wywoływać ten alias, ale potrzebujesz cudzysłowu, aby spacja była częścią słowa polecenia. Więc "ls -la" -p patternprzekaże -p patternopcję more, nie ls.
alias lsm='ls -la | more'
Odpowiedzi:
Dokumentacja Bash stwierdza: „W prawie każdym celu funkcje powłoki są lepsze niż aliasy”. Oto funkcja powłoki, która zastępuje
ls
i powoduje przesyłanie danych wyjściowych,more
jeśli argument składa się z (tylko)-la
.Jako jedna linijka:
Automatycznie wyjście rurowe:
źródło
command
zapobiega rekursywnemu wywoływaniu funkcji.Ze strony podręcznej aliasu :
Tak więc tylko pierwsze słowo jest sprawdzane pod kątem dopasowania aliasów, co uniemożliwia aliasy wielowyrazowe. Możesz być w stanie napisać skrypt powłoki, który sprawdza argumenty i wywołuje twoje polecenie, jeśli są zgodne, a w przeciwnym razie po prostu wywołuje normalne
ls
(patrz odpowiedź @Dennis Williamson )źródło
Nieco ulepszone podejście zaczerpnięte z odpowiedzi Dennisa:
Lub liniowiec:
Pozwala to na przykład dołączyć dodatkowe opcje / argumenty po komendzie, jeśli to konieczne
ls -la -h
źródło
ls -lat
zostać wykluczony z tego leczenia? Musiałbym postawić skrzynkę, aby poradzić sobie z tym nad-la*
wpisem, tak?Możesz nadal wywoływać ten alias, ale potrzebujesz cudzysłowu, aby spacja była częścią słowa polecenia. Więc
"ls -la" -p pattern
przekaże-p pattern
opcjęmore
, niels
.źródło