Bash: Spacje w nazwie aliasu

116

Próbuję utworzyć aliasy w bash. Co chcę zrobić, to mapa ls -ladols -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ść?

sześćdziesiąt stóp
źródło
8
Dlaczego nie zrobićalias lsm='ls -la | more'
Nifle

Odpowiedzi:

125

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; }

Automatycznie wyjście rurowe:

ls -la
Dennis Williamson
źródło
1
dlaczego musisz używać podwójnych nawiasów wewnątrz instrukcji if?
sixtyfootersdude
1
@sixtyfootersdude: Forma z podwójnymi nawiasami jest silniejsza i używam jej z przyzwyczajenia. Zobacz mywiki.wooledge.org/BashFAQ/031
Dennis Williamson
Jakie jest ostateczne polecenie? alias ls = 'ls ()' ??
Jeef
1
@Jeef: Nie, moja odpowiedź używa funkcji zamiast aliasu. Zredagowałem go, aby uczynić go bardziej zrozumiałym.
Dennis Williamson,
6
@merlinpatt: commandzapobiega rekursywnemu wywoływaniu funkcji.
Dennis Williamson
53

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 )

ciężki
źródło
8
+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

ld_pvl
źródło
2
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.

Charles Stewart
źródło