¿Cómo creo un alias Bash permanente?

382

Me gustaría crear un alias para el rmcomando para tener un mensaje de confirmación después de ejecutar este comando. Entonces estoy creando un alias como este alias rm='rm -i'. Pero hasta donde sé, este es un alias temporal y dura hasta que cierras la terminal.

Como se explica aquí para guardar el alias de forma permanente, necesito ejecutar ~/.bash_aliaseso ~/.bashrccomandos en la terminal y agregar mi alias allí. Pero cuando ejecuto ~/.bashrcme sale el siguiente mensaje de error:

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

Cuando ejecuto ~/.bash_aliasesme sale otro mensaje de error como este:

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

¿Cuál es el problema real y cómo puedo resolverlo?

Bakhtiyor
fuente
2
RESPUESTA - stackoverflow.com/a/2622711/1487102
neaumusic
alias rm='rm -i'no resuelve el problema de usar rm al azar
qwr

Respuestas:

429

Para crear un alias de forma permanente, agregue el alias a su .bashrcarchivo

gedit ~/.bashrc

Y luego agregue su alias en la parte inferior.

texto alternativo

Ahora ejecute . ~/.bashrcen su terminal (debe haber un espacio entre el .y ~/.bashrc.

Ahora puedes verificar tu alias.

texto alternativo

karthick87
fuente
55
@ karthick87 usted escribió "Ahora ejecute. ~ / .bashrc en su terminal (debe haber una brecha entre. y ~ / .bashrc". ¿Por qué es necesario este paso?
Geek
55
¿Qué significa el primer '.' hacer en ~ / .bashrc?
Zen
22
@Geek @Zen "Ejecutar" no era el término correcto. El punto es equivalente a source. Con . ~/.bashrc, obtienes tu fiesta. La ejecución del archivo iniciaría un proceso secundario, ejecutaría los comandos en este proceso y luego regresaría. Todo lo que se hace en el proceso hijo no tiene ningún efecto en el proceso padre (el bash desde el que ejecutó). En cambio, el abastecimiento (con el punto) actúa exactamente como si hubiera escrito el contenido del archivo en el terminal. Esto es lo que quieres. .bashrcse obtiene cada vez que comienzas una fiesta. Si realiza cambios, no se aplicarán hasta que inicie una nueva bash o fuente manualmente.
Gauthier
@ButtleButkus: es posible que desee cambiar solo las preferencias de un usuario en lugar de todo el sistema. En Ubuntu, el archivo .bashrc en todo el sistema es /etc/bash.bashrc
WillC
1
@ShubhamA. vea esta pregunta para el comportamiento de OSX
Jandersen
253

Hay muchas formas de crear un alias. Las formas más utilizadas son:

  1. Agregue alias directamente en su ~/.bashrcarchivo

    Por ejemplo: agregue estas líneas al ~/.bashrcarchivo

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

    La próxima vez (después de haber cerrado / cerrado sesión, o hecho . ~/.bashrc) cuando escriba rmel rm -icomando se ejecutará.

  2. El segundo método le permite crear un archivo de alias por separado, por lo que no tendrá que ponerlos .bashrc, sino en un archivo de su elección. Primero, edite su ~/.bashrcarchivo y agregue las siguientes líneas si aún no existen, o descomente si lo hacen:

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

    Guárdelo y cierre el archivo. Después de eso, todo lo que tiene que hacer es crear un ~/.bash_aliasesarchivo y agregar sus alias allí, con el mismo formato especificado en el primer método.

    Contenido de mi ~/.bash_aliasesarchivo:

    alias cs='cd;ls'
aneeshep
fuente
72
+1 por usar ~/.bash_aliases.
ændrük
Sí, usar otro archivo para los alias es mucho más limpio, también portátil entre distribuciones. Utilizo ese archivo porque algunos alias no son suficientes y se necesita una función. Por lo tanto, es mucho más limpio si usa un archivo para esa tarea. Tengo otro alias -> alias aliases="xdg-open ~/.bash_aliases && source ~/.bash_aliases", por lo que el alias estuvo disponible para guardar, y si comete algún error, lo anunciará.
erm3nda
de alguna manera, después de agregar el alias, por ejemplo alias ls='ls -althr', algunas de las banderas dadas no tendrían efecto, en este caso la bandera -t no tuvo efecto. ¿Sabes por qué?
Sajuuk
3
Por defecto ~/.bashrccontiene inclusión para ~/.bash_aliases, no es necesario editarlo.
Jaakko
1
No siempre ~ / .bashrc contiene la inclusión de ~ / .bash_aliases como fue en mi caso con el terminal de Ubuntu Windows 10, esta solución fue muy útil.
José
19

Me parece que su único problema es simplemente intentar ejecutar .bashrc cuando no es ejecutable. Pero esta no es la forma correcta de hacerlo; cada vez que realice un cambio en este archivo, debe "ejecutarlo" mediante el comando:

source ~/.bashrc

De lo contrario, simplemente creará un nuevo shell, ejecutará el archivo en el entorno del nuevo shell, luego descartará ese entorno cuando salga, perdiendo así el cambio. Al obtener el script, se ejecuta dentro del shell actual, por lo que permanecerá vigente.

Supongo que el segundo error fue porque bash_aliases no existe. No es obligatorio, solo se recomienda mantener sus cambios separados y organizados. Solo se usa si existe, y puede ver la prueba en .bashrc:

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

Esto dice que si el archivo ~ / .bash_aliases existe, ejecútelo.

Marty Fried
fuente
~/.bash_aliaseses mejor. askubuntu.com/questions/194111/…
tomByrer
1
El uso del sourcecomando hizo que mis alias funcionaran. +1
dspacejs
44
Solo para completar: el punto inicial en la línea . ~/.bash_aliasestiene el mismo significado que el comando incorporado del shell source. Creo que esta es la respuesta correcta, explicando lo que está sucediendo.
Melebius
17

El problema es que está intentando ejecutar un archivo no ejecutable: puede verificar esto con:

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

Tenga en cuenta que no hay una letra "x - ejecutable" en la primera columna (permisos de archivo).

Los archivos de perfil no son archivos ejecutables, en lugar de ejecutarlos, los carga con:

source /home/bakhtiyor/.bashrc

o

. /home/bakhtiyor/.bashrc
João Pinto
fuente
7
echo "alias vps='ssh -X [email protected]'" >> ~/.bashrc

Este es un ejemplo que estaba buscando, una forma de escribir algunas letras en el terminal ("vps") para iniciar sesión de forma remota en un servidor y habilitar el reenvío X11 para que pueda ejecutar aplicaciones gui como "gedit" en la red.

Cualquiera que sea el comando / comando con alias, de esta manera con la declaración de eco, las comillas y el símbolo para agregar la salida de un comando a un archivo (>>) me funciona. Simplemente reemplace mi comando por el comando alias que necesita e ingréselo en su terminal.

usuario80638
fuente
La cita aquí es un poco complicada. En este ejemplo, el uso de comillas dobles no es problemático, pero si el texto dentro de las comillas contiene signos de dólar, barras invertidas, etc., deberá comprender cómo los procesa el shell dentro de las comillas dobles. Puede cambiar a comillas simples en el exterior y comillas dobles en el interior, pero aún debe comprender cómo Bash procesa las comillas dobles en la definición de alias.
tripleee
5

si está usando ruby, puede instalar 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

el rubygem auto-originará su archivo de puntos para que no lo necesite. Echale un vistazo.

ytbryan
fuente
4

Escribí esta útil función para crear rápidamente un nuevo alias y luego escribir la definición del alias ~/.bash_aliases (si existe) o ~/.bashrc.

CONSEJO : Asegúrese de que ~/.bash_aliasesexista y se ejecute en ~/.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"
}
blizzrdof77
fuente
1
Buena idea, pero el uso descuidado de esta función puede llevar a la basura .bashrccon múltiples instancias de aliascomando. Su función definitivamente necesita implementar algunos chequeos para evitar tal desorden.
Troublemaker-DV
Este es un punto válido. ¿Tiene una solución sugerida que está dispuesto a compartir @ Troublemaker-DV?
blizzrdof77
No estoy seguro si todavía es real 2 1 / 2yo más tarde, pero ... Al primero, buscaría en el RC los comandos de alias para verificar, si este alias ya se ingresó allí para evitar duplicados. Su verificación de la existencia de un alias no es suficiente, porque el RC ya podría estar "contaminado" con múltiples alias del mismo nombre.
Troublemaker-DV
0

Sugeriría usar /etc/bash.bashrc

Puede agregar una línea al final de ese archivo.

alias ok="ping google.com"

Después de poner los alias por línea, debe reiniciar o volver a iniciar sesión.

Fahad Ahammed
fuente
77
"Sugeriría ..." y ¿por qué sugieres eso?
muru
2
No debe meterse con el archivo del sistema a menos que desee específicamente instalar una configuración de todo el sistema para todos los usuarios. En un sistema personal, la diferencia es marginal, pero luego jugar con los archivos del sistema es más complicado en el futuro, por lo que probablemente debería preferir sus propios archivos de puntos personales para sus preferencias personales (y eso hace que sea más fácil copiar la configuración en otro lugar) el futuro también).
tripleee
1
¿Reiniciar? Ese es un consejo realmente terrible, NO lo hagas, especialmente cuando source /etc/bash.bashrchace todo lo que quieres en este ejemplo. Pero debería usar ~/.bashrco en su ~/.bash_aliaseslugar
Xen2050
@ Xen2050, sugerí reiniciar para mostrar que funciona después de reiniciar / reiniciar sesión. Por cierto, incluso otra ventana de terminal limpia también funcionará.
Fahad Ahammed
1
Puede actualizar a un nuevo kernel sin reiniciar, no se trata de ventanas antiguas ;-)
Xen2050
0

Como recuerdo, bashrctiene o tenía una línea que sugiere no usarla directamente para los alias. La solución es usar un archivo o archivos externos. Se han agregado los alias fooy bar, pero para agregar bazel bashrcarchivo se debe "obtener" (o simplemente abrir un nuevo terminal). Ejemplo como:

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:~$ 

ahora el bazalias funciona. Me acabo de dar cuenta de que una respuesta anterior había mencionado esta técnica, pero habían enterrado el lede.

Thufir
fuente