Come posso creare un alias permanente di Bash?


382

Vorrei creare un alias da rmcomandare per avere un messaggio di conferma dopo aver eseguito questo comando. Quindi sto creando un alias come questo alias rm='rm -i'. Ma per quanto ne so questo è un alias temporaneo e dura fino a quando non si chiude il terminale.

Come è spiegato qui per salvare l'alias in modo permanente, devo eseguire ~/.bash_aliaseso ~/.bashrccomandi nel terminale e aggiungere il mio alias lì. Ma quando eseguo ~/.bashrcricevo il seguente messaggio di errore:

bash: /home/bakhtiyor/.bashrc: Permission denied

Quando corro ~/.bash_aliasesricevo un altro messaggio di errore come questo:

bash: /home/bakhtiyor/.bash_aliases: File or directory doesn't exist.

Qual è il problema reale e come posso risolverlo?



alias rm='rm -i'non risolve il problema dell'utilizzo di rm a casaccio
qwr,

Risposte:


429

Per creare un alias in modo permanente aggiungere l'alias al tuo .bashrcfile

gedit ~/.bashrc

E quindi aggiungi il tuo alias in fondo.

testo alternativo

Ora esegui . ~/.bashrcnel tuo terminale (dovrebbe esserci uno spazio tra il .e ~/.bashrc.

Ora puoi controllare il tuo alias.

testo alternativo


5
@ karthick87 hai scritto "Ora esegui. ~ / .bashrc nel tuo terminale (dovrebbe esserci un divario tra il. e ~ / .bashrc.". Perché è necessario questo passaggio?
Geek,

5
cosa fa il primo "." fare dentro. ~ / .bashrc?
Zen,

22
@Geek @Zen "Execute" non era il termine corretto. Il punto equivale a source. Con . ~/.bashrc, fonte il tuo bash. L'esecuzione del file avviava un processo figlio, eseguiva i comandi in questo processo, quindi tornava. Tutto ciò che viene fatto nel processo figlio non ha alcun effetto sul processo genitore (la bash da cui è stata eseguita). Invece, il sourcing (con il punto) si comporta esattamente come se si scrivesse il contenuto del file nel terminale. Questo è quello che vuoi. .bashrcviene fornito ogni volta che inizi una festa. Se apporti modifiche, queste non si applicheranno fino a quando non avvierai manualmente un nuovo bash o una nuova fonte.
Gauthier,

@ButtleButkus - potrebbe voler modificare solo le preferenze di un utente piuttosto che l'intero sistema. In Ubuntu il file .bashrc a livello di sistema è /etc/bash.bashrc
WillC,

1
@ShubhamA. vedi questa domanda per il comportamento di OSX
jandersen

253

Esistono molti modi per creare un alias. I modi più utilizzati sono:

  1. Aggiungi alias direttamente nel tuo ~/.bashrcfile

    Ad esempio: aggiungi queste righe al ~/.bashrcfile

    alias ll='ls -l'
    alias rm='rm -i'

    La prossima volta (dopo aver effettuato il logout / in, o finito . ~/.bashrc) quando si digita rmil rm -icomando verrà eseguito.

  2. Il secondo metodo ti consente di creare un file alias separato, quindi non dovrai inserirli .bashrc, ma in un file a tua scelta. Innanzitutto, modifica il tuo ~/.bashrcfile e aggiungi le seguenti righe se non esistono già, oppure decommentali se lo fanno:

    if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
    fi

    Salvalo e chiudi il file. Dopodiché, tutto ciò che devi fare è creare un ~/.bash_aliasesfile e aggiungere i tuoi alias lì, con lo stesso formato specificato nel primo metodo.

    Contenuto del mio ~/.bash_aliasesfile:

    alias cs='cd;ls'

72
+1 per l'utilizzo ~/.bash_aliases.
ændrük,

Sì, l'uso di un altro file per gli alias è molto più pulito, anche portatile tra le distro. Uso quel file perché alcuni alias non sono sufficienti ed è necessaria una funzione. Quindi è molto più pulito se si utilizza un file per tale attività. Ho un altro alias -> alias aliases="xdg-open ~/.bash_aliases && source ~/.bash_aliases", quindi l'alias è diventato utile al salvataggio, e se commetti un errore ti farà pubblicità.
erm3nda,

in qualche modo dopo aver aggiunto l'alias come alias ls='ls -althr', alcuni dei flag indicati non avrebbero avuto effetto, in questo caso il flag -t non aveva effetto. sai perché?
Sajuuk,

3
Per impostazione predefinita ~/.bashrccontiene l'inclusione per ~/.bash_aliases, non è necessario modificarlo.
Jaakko,

1
Non sempre ~ / .bashrc contiene l'inclusione per ~ / .bash_aliases come nel mio caso con il terminale Ubuntu Windows 10 questa soluzione è stata molto utile.
Jose

19

Mi sembra che il tuo unico problema sia semplicemente provare a eseguire .bashrc quando non è eseguibile. Ma questo non è il modo corretto di farlo; ogni volta che si modifica un file, è necessario "eseguirlo" con il comando:

source ~/.bashrc

Altrimenti, creerà semplicemente una nuova shell, eseguirà il file nell'ambiente della nuova shell, quindi eliminerà quell'ambiente quando esce, perdendo così la modifica. Acquisendo lo script, viene eseguito all'interno della shell corrente, quindi rimarrà in vigore.

Suppongo che il secondo errore sia dovuto al fatto che bash_aliases non esiste. Non è richiesto, è solo consigliato di mantenere le modifiche separate e organizzate. Viene usato solo se esiste e puoi vedere il test in .bashrc:

if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi

Questo dice che se esiste il file ~ / .bash_aliases, allora eseguilo.


~/.bash_aliasesè meglio. askubuntu.com/questions/194111/…
tomByrer

1
usando il sourcecomando ha fatto funzionare i miei alias. +1
dspacejs il

4
Solo per completezza: il punto iniziale sulla linea . ~/.bash_aliasesha lo stesso significato del comando integrato della shell source. Trovo che questa sia la risposta corretta, spiegando cosa sta succedendo.
Melebio

17

Il problema è che stai tentando di eseguire un file non eseguibile: puoi verificarlo con:

ls -la ~/.bashrc
-rw-r--r-- 1 username username 3596 2010-08-05 17:17 /home/pt001424/.bashrc

Nota che non c'è una lettera "x - eseguibile" sulla prima colonna (permessi dei file).

I file di profilo non sono file eseguibili, invece di eseguirli li carichi con:

source /home/bakhtiyor/.bashrc

o

. /home/bakhtiyor/.bashrc

7
echo "alias vps='ssh -X user@example.com'" >> ~/.bashrc

Questo è un esempio che stavo cercando, un modo per digitare alcune lettere sul terminale ("vps") per accedere in remoto a un server e abilitare l'inoltro X11 in modo da poter eseguire app gui come "gedit" sulla rete.

Qualunque sia il comando / comando con alias, in questo modo con l'istruzione echo, le virgolette e il simbolo per aggiungere l'output di un comando a un file (>>) funziona per me. Sostituisci semplicemente il mio comando per il comando alias che ti serve e inseriscilo nel tuo terminale.


La citazione qui è leggermente complicata. In questo esempio, l'uso delle virgolette non è problematico, ma se il testo tra virgolette contiene segni di dollaro, barre rovesciate, ecc., Dovrai capire come la shell li elabora tra virgolette doppie. Puoi passare a virgolette singole all'esterno e doppie virgolette all'interno, ma devi comunque capire come Bash elabora le virgolette doppie nella definizione di alias.
tripla il

5

se stai usando ruby, puoi installare aka usando rubygem.

gem install aka2

uso

aka generate hello="echo helloworld" #add an alias
aka g hello="echo helloworld"  #add alias for lazy people

aka destroy hello #remove alias
aka d hello #remove alias for lazy people

il rubygem procurerà automaticamente il file dot in modo che non sia necessario. Controlla.


4

Ho scritto questa utile funzione per creare rapidamente un nuovo alias, quindi scrivere la definizione di alias su ~/.bash_aliases (se esiste) o ~/.bashrc.

SUGGERIMENTO : assicurarsi che ~/.bash_aliasesesista e sia eseguito in ~/.bashrc.

# -----------------------------------
#  Create a new permanent bash alias
#
#  @param $1 - name
#  @param $2 - definition
# -----------------------------------
new-alias () { 
  if [ -z "$1" ]; then
    echo "alias name:" && read NAME
  else
    NAME=$1
  fi

  if alias $NAME 2 > /dev/null > /dev/null; then
    echo "alias $NAME already exists - continue [y/n]?" && read YN
    case $YN in
      [Yy]* ) echo "okay, let's proceed.";;
      [Nn]* ) return;;
      * ) echo "invalid response." && return;;
    esac
  fi

  if [ -z "$2" ]; then
    echo "alias definition:" && read DEFINTION
  else
    DEFINTION="$2"
  fi

  if [ -f ~/.bash_aliases ]; then
    echo "alias $NAME=\"$DEFINTION\"" >> ~/.bash_aliases
  else
    echo "alias $NAME=\"$DEFINTION\"" >> ~/.bashrc
  fi

  alias $NAME="$DEFINTION"
}

1
Buona idea, ma l'uso noncurante di questa funzione può portare alla distruzione .bashrccon più istanze di aliascomando. La tua funzione deve sicuramente implementare alcuni controlli per evitare tale ingombro.
Troublemaker-DV

Questo è un punto valido Hai una soluzione suggerita che sei disposto a condividere @ Troublemaker-DV?
blizzrdof77,

Non sono sicuro che sia ancora vero 2 1 / 2anni più tardi, ma ... Al 1 ° farei un grep da RC per controllare i comandi alias, se questo alias era già stato inserito lì per evitare duplicati. Il tuo controllo per l'esistenza di un alias non è sufficiente, perché RC potrebbe essere già "contaminato" con più alias con lo stesso nome.
Troublemaker-DV il

0

Suggerirei di usare /etc/bash.bashrc

Puoi aggiungere una riga alla fine di quel file.

alias ok="ping google.com"

Dopo aver inserito gli alias per riga, è necessario riavviare o accedere nuovamente.


7
"Suggerirei .." e perché lo consiglieresti?
muru,

2
Non si dovrebbe fare confusione con il file di sistema a meno che non si desideri installare un'impostazione a livello di sistema per tutti gli utenti. Su un sistema personale, la differenza è marginale, ma poi fare confusione con i file di sistema è più complicato lungo la strada, quindi probabilmente dovresti comunque preferire i tuoi file dot personali per le preferenze personali (e ciò rende più semplice copiare le impostazioni da qualche altra parte in anche il futuro).
tripla il

1
Riavviare? È un consiglio davvero terribile, NON farlo, specialmente quando source /etc/bash.bashrcfa tutto ciò che vuoi in questo esempio. Ma dovrebbe usare ~/.bashrco ~/.bash_aliasesinvece
Xen2050

@ Xen2050, ho suggerito di riavviare per mostrare che funziona dopo il riavvio / riaccedere. A proposito, funzionerà anche un'altra finestra del terminale pulita.
Fahad Ahammed,

1
È possibile eseguire l'aggiornamento a un nuovo kernel senza riavviare, questa non è una vecchia finestra ;-)
Xen2050

0

Come ricordo, bashrcha, o aveva, una linea che suggerisce di non usarlo direttamente per gli alias. La soluzione è utilizzare un file esterno (i). Gli alias fooe barsono stati aggiunti, ma per aggiungere bazil bashrcfile deve essere "di provenienza" (o, basta aprire un nuovo terminale). Esempio come:

thufir@dur:~$ 
thufir@dur:~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias bar='echo foo'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias foo='echo foo'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
thufir@dur:~$ 
thufir@dur:~$ cat .bash_aliases 
alias foo='echo foo'
alias bar='echo foo'
alias baz='echo baz'

thufir@dur:~$ 
thufir@dur:~$ source .bashrc 
thufir@dur:~$ 
thufir@dur:~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias bar='echo foo'
alias baz='echo baz'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias foo='echo foo'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
thufir@dur:~$ 
thufir@dur:~$ baz
baz
thufir@dur:~$ 

ora l' bazalias funziona. Mi sono appena reso conto che una precedente risposta aveva menzionato questa tecnica, ma avevano seppellito il lede.

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.