Lag et Bash-alias som tar en parameter?

Jeg pleide å bruke CShell ([tag:csh]), som lar deg lage et alias som tar en parameter. Notasjonen var noe sånt som

alias junk="mv \\!* ~/.Trash"

I Bash, dette ser ikke ut til å fungere. Gitt at Bash har en rekke nyttige funksjoner, vil jeg anta at denne har blitt implementert, men jeg lurer på hvordan.

Løsning

Bash-alias aksepterer ikke direkte parametere. Du må opprette en funksjon.

alias godtar ikke parametere, men en funksjon kan kalles akkurat som et alias. For eksempel

myfunction() {
    #do things with parameters like $1 such as
    mv "$1" "$1.bak"
    cp "$2" "$1"
}

myfunction old.conf new.conf #calls `myfunction`

Forresten, Bash-funksjoner definert i .bashrc og andre filer er tilgjengelige som kommandoer i skallet ditt. Så for eksempel kan du kalle den tidligere funksjonen som dette

$ myfunction original.conf my.conf
Kommentarer (19)

Ved å avgrense svaret ovenfor kan du få 1-linjes syntaks som du kan for alias, noe som er mer praktisk for ad hoc-definisjoner i et skall eller .bashrc-filer:

bash$ myfunction() { mv "$1" "$1.bak" && cp -i "$2" "$1"; }

bash$ myfunction original.conf my.conf

Ikke glem semikolon før den avsluttende høyre parentesen. Det samme gjelder for selve spørsmålet:

csh% alias junk="mv \\!* ~/.Trash"

bash$ junk() { mv "$@" ~/.Trash/; }

Eller:

bash$ junk() { for item in "$@" ; do echo "Trashing: $item" ; mv "$item" ~/.Trash/; done; }
Kommentarer (8)

Her er tre eksempler på funksjoner jeg har i min ~/.bashrc, som i hovedsak er alias som aksepterer en parameter:

#Utility required by all below functions.
#https://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-bash-variable#comment21953456_3232433
alias trim="sed -e 's/^[[:space:]]*//g' -e 's/[[:space:]]*\$//g'"

.


:
Kommentarer (6)