Comprender .bashrc y .bash_profile


26

En un servidor cuando inicio sesión como root, veo .bashrc(Ubuntu 10.10).

En mi Mac tengo un .bash_profile

¿Ubuntu siempre tiene solo un .bashrcarchivo y no .bash_profile? (Solo estoy confundido, así que preguntando, me doy cuenta de que son diferentes o / s, pero ¿tal vez hay una relación de alguna manera?)

En mi servidor, quiero crear un alias, ¿debería ponerlo .bashrc?

¿Qué sucede si deseo que se aplique este alias para que todos los usuarios puedan usarlo?


1
posiblemente duplicado de: askubuntu.com/questions/1528/bashrc-or-bash-profile : le recomiendo que cambie su pregunta para preguntar dónde colocar los alias a nivel mundial.

Respuestas:


39

Los alias de bash deben ir en los archivos .bash_aliaseso .bashrcen directorios de inicio individuales. Si debe crear alias bash globales, pueden entrar /etc/bash.bashrc, pero a menudo es mejor simplemente agregarlos a los archivos .bash_aliaseso para que sean heredados por los usuarios recién creados..bashrc/etc/skel

Es casi siempre malo para definir un alias en en .profile, .bash_profileo /etc/profile.

Para entender por qué, uno debe entender bajo qué circunstancias se ejecutan los comandos de cada uno de estos archivos . Hay ideas erróneas sobre esto, que abordo a continuación.

Aunque desee definir alias para varios usuarios, debe estar familiarizado con cómo se definen para usuarios individuales, de modo que pueda decidir el mejor método para hacer lo que necesita.

Alias ​​para usuarios individuales

Especialmente si usa una GUI, la mayoría de sus shells interactivos son probablemente shells sin inicio de sesión . Incluso si nunca usa una GUI, probablemente todavía use shells sin inicio de sesión con cierta frecuencia. Querrás que tus alias funcionen en estos shells.

Especialmente si alguna vez inicia sesión de forma no gráfica en una consola virtual o mediante SSH , es probable que use shells de inicio de sesión algunas veces. Por lo tanto, también querrá que sus alias funcionen en shells de inicio de sesión interactivos.

Cuando se inicia un shell interactivo sin inicio de sesión , se origina .bashrcen el directorio de inicio del usuario. Por defecto en Ubuntu, cada usuario .bashrcse abastece .bash_aliases, si existe.

  • Para fuente de un archivo es hacer que su contenido se ejecuten en el actual shell. Los cambios en el entorno de shell realizados en un archivo que se obtiene persisten incluso después de que se hayan ejecutado todos los comandos del archivo.

La lectura de los comentarios en el valor predeterminado de Ubuntu .bashrcrevela que oficialmente se pretende que los alias entren .bashrco .bash_aliases. .bashrcya contiene algunas definiciones de alias (ejecutar grep '^[[:blank:]]*alias' ~/.bashrcpara verlas) y brinda consejos explícitos sobre dónde colocar nuevas definiciones de este tipo:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

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

¿Pero qué pasa con los shells de inicio de sesión interactivos ? En lugar de .bashrc, iniciar sesión fuente de shells .profile.

  • ... A menos que .bash_loginexista, entonces se obtiene en su lugar.
  • ... A menos que .bash_profileexista, entonces se obtiene en su lugar.

Sin embargo, la buena noticia es que por defecto en Ubuntu, los comandos en .bashrcserán también se ejecutan en shells de entrada interactivos debido a las predeterminadas .profilecomprueba si el shell actual es bash (y si .bashrcexiste), y si es así, las fuentes .bashrc:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Sugiero que los usuarios definan nuevos alias bash .bash_aliasesen sus directorios de inicio (creándolo si aún no existe). Esta es una forma particularmente limpia y simple de hacer que las definiciones de alias sean permanentes en el nivel por usuario.

Los alias no deben definirse.profile porque permanecerían indefinidos en shells sin inicio de sesión. A diferencia de gran parte del entorno de un bash shell, los alias no se exportan a los shells secundarios:

ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found

En particular, de manera predeterminada, la mayoría de los entornos de escritorio .profilese originan en el inicio de sesión gráfico, pero:

  1. Esto no se hace necesariamente por un shell bash, por lo que las definiciones de alias ni siquiera se pueden procesar, y lo que es más importante
  2. incluso si se procesan las definiciones de alias, no se pasan a procesos secundarios . En particular, no se transmiten a los depósitos creados al abrir una ventana de Terminal.

Los alias no deben definirse en .bash_profile(o .bash_login) por la misma razón, sino también por otra razón. ¡Crear ingenuamente uno de estos archivos y poner solo definiciones de alias evita que se .profileejecute cualquiera de los códigos !

En situaciones en las que .bash_profileo .bash_loginrealmente es útil, generalmente uno se .profileencuentra en algún lugar de ellas, lo que resuelve ese problema. (Entonces, el único problema que queda es que, al igual que con .profile, definir alias en .bash_profileo .bash_loginno funciona correctamente).

Alias ​​para nuevos usuarios individuales, automáticamente

Cuando se crea una cuenta de usuario del tipo destinado a representar a un ser humano real, generalmente se crea un nuevo directorio para que sirva como su directorio de inicio. El contenido de /etc/skelse copia a su directorio de inicio. Así es como varios usuarios comienzan con algunos archivos de configuración similares en sus directorios de inicio. En Ubuntu, esto incluye .profile, .bashrcy algunos otros archivos.

Para cambiar qué alias se definen para los nuevos usuarios, simplemente puede ponerlos /etc/skel/.bash_aliases(tendrá que crearlos) o /etc/skel/.bashrc.

Si edita un archivo ya existente, /etc/skeles posible que desee hacer una copia de seguridad primero, pero no debe colocar la copia de seguridad /etc/skel, o también se copiará en los directorios principales de los nuevos usuarios.

Esta es probablemente la mejor forma de agregar nuevos alias para múltiples usuarios. Los usuarios existentes pueden simplemente agregar los alias ellos mismos. Si define los alias en /etc/skel/.bash_aliases, simplemente puede dirigirlos a ese archivo, que pueden elegir copiar en sus directorios de inicio (o agregar a su propio .bash_aliasesarchivo personalizado ).

Es trivial que un usuario defina un alias. Además, los alias no son extremadamente robustos ; funcionan solo en circunstancias particulares. Si necesita crear un nuevo comando que funcione todo el tiempo, para todos , no debe implementar ese comando como un alias. Y no puede forzar con éxito los alias a los usuarios que no los quieren, simplemente pueden unaliasusarlos.

Alias ​​globales, para todos los usuarios

Aunque le aconsejo que evite este enfoque, puede definir alias en el archivo global /etc/bash.bashrc . Luego se definirán tanto para shells interactivos sin inicio de sesión como para shells interactivos de inicio de sesión. El motivo es que, antes de que se obtenga cualquiera de los archivos del directorio de inicio del usuario:

  • Los shells de inicio de sesión (y solo los shells de inicio de sesión y otros procesos que se comportan como shells de inicio de sesión) ejecutan comandos /etc/profileautomáticamente.
  • Solo los shells sin inicio de sesión ejecutan comandos /etc/bash.bashrcautomáticamente, pero
  • El valor predeterminado de Ubuntu /etc/profileverifica si el shell en ejecución es bash (y si /etc/bash.bashrcexiste) y, de ser así, las fuentes /etc/bash.bashrc.

Esto es análogo a cómo el usuario predeterminado obtiene el usuario .profilepor usuario .bashrcsi el shell es bash (como se detalla anteriormente).

Así es como se ve el código real para esto en el valor predeterminado /etc/profile:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

Ese bloque también realiza otras tareas. Específicamente, el externo ifverifica si es probable que el shell sea interactivo (verificando que el texto de solicitud no esté vacío), luego verifica si el shell actual es bash y fuentes /etc/bash.bashrcsi lo es, y si no funciona, para bash , ya está hecho en /etc/bash.bashrc.

Usted debe no definir alias globales en /etc/profilelos mismos usuarios razón no les deben definir en sus locales .profiles: si lo hace, que se definirán sólo para shells de entrada, y no por sus conchas niño.

Finalmente, tenga en cuenta que, a diferencia del predeterminado por usuario .bashrc, el /etc/bash.bashrcarchivo predeterminado no contiene nada sobre alias. Es algo inusual dar a los usuarios alias en un archivo donde no pueden editarlos o deshabilitarlos. (Por supuesto, todavía pueden hacer eso, anulando sus definiciones en su propio local de .bashrc, .bash_aliaseso en otro lugar).

Otras lecturas


5

Aquí hay una buena lectura al respecto. ".bash_profile se ejecuta para shells de inicio de sesión, mientras que .bashrc se ejecuta para shells interactivos sin inicio de sesión"

Entonces, para su alias, use .bash_profile


44
Poner alias .bash_profileno es correcto. En Ubuntu, .profile(que se ejecuta para shells de inicio de sesión) se origina .bashrccuando se trata de un bash shell interactivo. Por lo tanto, poner alias .bashrc(o .bash_aliasesfuentes .bashrc) los define en todos los shells interactivos de bash. Los alias en los .bash_profilerendimientos de este problema , entre otros. Ver este , que , mi respuesta , y el valor predeterminado ~/.bashrccomentarios que recomiendan poner alias allí o en 's .bash_aliases.
Eliah Kagan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.