Bash: spazi nel nome alias


117

Sto cercando di creare un alias in bash. Quello che voglio fare è mappa ls -laperls -la | more

Nel mio file .bashrc questo è quello che ho tentato:

alias 'ls -la'='ls -la | more'

Tuttavia non funziona perché (presumo) ha spazi nel nome alias. C'è un lavoro in giro per questo?


8
Perché non farloalias lsm='ls -la | more'
Nifle

Risposte:


126

La documentazione di Bash afferma "Per quasi tutti gli scopi, le funzioni della shell sono preferite agli alias". Ecco una funzione shell che sostituisce lse causa il piping dell'output morese l'argomento è costituito (solo) -la.

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}

Come una linea:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Uscita automatica del tubo:

ls -la

1
perché è necessario utilizzare doppie parentesi all'interno dell'istruzione if?
sixtyfootersdude,

1
@sixtyfootersdude: la forma a doppia parentesi è più potente e la uso per abitudine. Vedi mywiki.wooledge.org/BashFAQ/031
Dennis Williamson

Quindi qual è il comando finale? alias ls = 'ls ()' ??
Jeef

1
@Jeef: No, la mia risposta utilizza una funzione anziché un alias. L'ho modificato per cercare di renderlo più chiaro.
Dennis Williamson,

6
@merlinpatt: commandimpedisce che la funzione venga chiamata in modo ricorsivo.
Dennis Williamson,

53

Dalla pagina man dell'alias :

La prima parola di ogni semplice comando, se non quotata, viene controllata per vedere se ha un alias. In tal caso, tale parola è sostituita dal testo dell'alias. Il nome alias e il testo sostitutivo possono contenere qualsiasi input shell valido, inclusi i metacaratteri shell, con l'eccezione che il nome alias non può contenere `= '.

Pertanto, viene verificata solo la prima parola per le corrispondenze di alias che rendono impossibili gli alias di più parole. Potresti essere in grado di scrivere uno script di shell che controlla gli argomenti e chiama il tuo comando se corrispondono e altrimenti chiama semplicemente il normale ls(Vedi la risposta di @Dennis Williamson )


8
+1 Per spiegare perché non mi è permesso usare ls -la come alias.
sixtyfootersdude,

7
Questo è stato utile perché invece di provare a risolverlo ha risposto alla domanda. Sono venuto qui perché volevo creare un alias con uno spazio al suo interno e questo non accadrà.
angryundead,

Ciò non solo ha risposto alla mia domanda, ma mi ha fornito preziose informazioni su come funziona effettivamente il meccanismo di aliasing. La tua citazione dalla pagina man è stata molto utile.
Lily Finley il

14

Un approccio leggermente migliorato tratto dalla risposta di Dennis:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

O il one-liner:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

Ciò consente, ad esempio, di aggiungere ulteriori opzioni / argomenti dopo il comando, se necessario ls -la -h


2
Come funziona questo se voglio ls -latessere escluso da questo trattamento? Dovrei mettere un caso per gestirlo sopra la -la*voce, sì?
Steven Lu,

-1

Puoi ancora invocare questo alias, ma hai bisogno di virgolette affinché lo spazio faccia parte della parola di comando. Quindi "ls -la" -p patternpasserà l' -p patternopzione a more, no ls.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.