Próbuję utworzyć aliasy w bash. Co chcę zrobić, to mapa ls -la
dols -la | more
W moim pliku .bashrc próbowałem:
alias 'ls -la'='ls -la | more'
Jednak to nie działa, ponieważ (zakładam) ma spacje w nazwie aliasu. Czy można to obejść?
Próbuję utworzyć aliasy w bash. Co chcę zrobić, to mapa ls -la
dols -la | more
W moim pliku .bashrc próbowałem:
alias 'ls -la'='ls -la | more'
Jednak to nie działa, ponieważ (zakładam) ma spacje w nazwie aliasu. Czy można to obejść?
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
.
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; }
Automatycznie wyjście rurowe:
ls -la
command
zapobiega rekursywnemu wywoływaniu funkcji.
Ze strony podręcznej aliasu :
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 )
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
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
, nie ls
.
alias lsm='ls -la | more'