Soy nuevo en Ubuntu. Estoy ejecutando 13.10 Desktop.
Quería establecer algunos alias de todo el sistema y un mensaje personalizado para bash. Encontré este artículo:
https://help.ubuntu.com/community/EnvironmentVariables
Siguiendo los consejos de este artículo, creé /etc/profiles.d/profile_local.sh. Es propiedad de root y tiene permisos de 644 al igual que los otros scripts allí:
root@ubuntu:/etc/profile.d# ll
total 28
drwxr-xr-x 2 root root 4096 Mar 23 08:56 .
drwxr-xr-x 135 root root 12288 Mar 23 09:15 ..
-rw-r--r-- 1 root root 660 Oct 23 2012 bash_completion.sh
-rw-r--r-- 1 root root 3317 Mar 23 07:36 profile_local.sh
-rw-r--r-- 1 root root 1947 Nov 23 00:57 vte.sh
Además, he confirmado que / etc / profile llama a /etc/profile.d. Contiene este bloque de código:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
Al iniciar sesión, no parece que se obtenga el script personalizado, profile_local.sh que creé. Sin embargo, si después de iniciar sesión, 'source /etc.profile.d/profile_local.sh', obtengo el comportamiento esperado, mis alias personalizados y un mensaje personalizado.
¿Qué estoy haciendo mal?
Contenido del script 'profile_local.sh':
# 3/23/14 - Copied from Gentoo /etc/bash/bashrc
# Placed in /etc/profile.d as described at:
# https://help.ubuntu.com/community/EnvironmentVariables
# This file is sourced by all *interactive* bash shells on startup,
# including some apparently interactive shells such as scp and rcp
# that can't tolerate any output. So make sure this doesn't display
# anything or bad things will happen !
# Test for an interactive shell. There is no need to set anything
# past this point for scp and rcp, and it's important to refrain from
# outputting anything in those cases.
if [[ $- != *i* ]] ; then
# Shell is non-interactive. Be done now!
return
fi
# Bash won't get SIGWINCH if another process is in the foreground.
# Enable checkwinsize so that bash will check the terminal size when
# it regains control. #65623
# http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11)
shopt -s checkwinsize
# Enable history appending instead of overwriting. #139609
shopt -s histappend
# Change the window title of X terminals
case ${TERM} in
xterm*|rxvt*|Eterm|aterm|kterm|gnome*|interix)
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007"'
;;
screen)
PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\033\\"'
;;
esac
use_color=false
# Set colorful PS1 only on colorful terminals.
# dircolors --print-database uses its own built-in database
# instead of using /etc/DIR_COLORS. Try to use the external file
# first to take advantage of user additions. Use internal bash
# globbing instead of external grep binary.
safe_term=${TERM//[^[:alnum:]]/?} # sanitize TERM
match_lhs=""
[[ -f ~/.dir_colors ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)"
[[ -z ${match_lhs} ]] \
&& type -P dircolors >/dev/null \
&& match_lhs=$(dircolors --print-database)
[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true
if ${use_color} ; then
# Enable colors for ls, etc. Prefer ~/.dir_colors #64489
if type -P dircolors >/dev/null ; then
if [[ -f ~/.dir_colors ]] ; then
eval $(dircolors -b ~/.dir_colors)
elif [[ -f /etc/DIR_COLORS ]] ; then
eval $(dircolors -b /etc/DIR_COLORS)
fi
fi
if [[ ${EUID} == 0 ]] ; then
PS1='\[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] '
else
PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] '
fi
alias ls='ls --color=auto'
alias grep='grep --colour=auto'
else
if [[ ${EUID} == 0 ]] ; then
# show root@ when we don't have colors
PS1='\u@\h \W \$ '
else
PS1='\u@\h \w \$ '
fi
fi
# Try to keep environment pollution down, EPA loves us.
unset use_color safe_term match_lhs
TZ="PST8PDT"
alias ll='ls -la'
alias dig='dig +search'
alias dir='ls -ba'
alias edit="ee"
alias ss="ps -aux"
alias dot='ls .[a-zA-Z0-9_]*'
alias news="xterm -g 80x45 -e trn -e -S1 -N &"
alias more="less"
alias c="clear"
alias m="more"
alias j="jobs"
# common misspellings
alias mroe=more
alias pdw=pwd
.sh
, es irrelevante y, de todos modos, los archivosprofile.d
provienen, no se ejecutan, lo que es ligeramente diferente y no requiere que el archivo sea ejecutable. El problema aquí es queprofile
& co no son leídos por scripts que no inician sesión..bashrc
y todos sus problemas desaparecerán. También hay una cuestión de precedencia, si uno de los archivos que se leen posteriormente también establece PS1, entonces el valor anterior será descartado. De todos modos, en serio, no toque los archivadores/etc
, juegue con los del directorio de inicio y.bashrc
no use el perfil..profile
archivos predeterminados en su hogar y la configuración allí sobrescribirá todo lo que haga/etc/profile
. Básicamente, nunca toque a/etc
menos que sepa lo que está haciendo. Para eso están los archivos específicos del usuario. Además, edite su pregunta y explique exactamente cómo se está conectando, eso lo cambia todo./etc/profile.d
que es una muy mala idea y afectará a todos los usuarios del sistema. Basta con incluir los comandos deprofile_local.sh
en su~/.profile
o, simplemente, la fuente de la secuencia de comandos mediante la adición de esta línea a su~/.profile
:. /path/to/profile_local.sh
. (el.
mediosource
, leerá el archivo que le dé y ejecutará los comandos que encuentre allí).Respuestas:
Para comprender lo que está sucediendo aquí, debe comprender un poco de información básica sobre cómo se ejecutan los shells (bash en este caso).
Cuando abre un emulador de terminal (
gnome-terminal
por ejemplo), está ejecutando lo que se conoce como un shell interactivo sin inicio de sesión .Cuando inicia sesión en su máquina desde la línea de comandos, mediante
ssh
o ejecuta un comando comosu - username
, está ejecutando un shell de inicio de sesión interactivo .Cuando inicia sesión gráficamente, está ejecutando algo completamente diferente, los detalles dependerán de su sistema y entorno gráfico, pero en general es el shell gráfico el que se ocupa de su inicio de sesión. Si bien muchos shells gráficos (incluido el predeterminado de Ubuntu) leerán,
/etc/profile
no todos lo harán.Finalmente, cuando ejecuta un script de shell, se ejecuta en un shell no interactivo y sin inicio de sesión .
Ahora, los archivos que bash leerá cuando se inicien dependen del tipo de shell en el que se ejecuta. Lo siguiente es un extracto de la sección INVOCACIÓN de
man bash
(énfasis mío):Lo que todo esto significa es que está editando el archivo incorrecto. Puede probar esto cayendo a una consola virtual usando Ctrl+ Alt+ F2(regrese a la GUI con Alt+ F7, o F8dependiendo de su configuración) e inicie sesión allí. Verá que su solicitud y sus alias están disponibles.
Por lo tanto, para que la configuración que desee se aplique a los shells que no son de inicio de sesión, el tipo que obtiene cada vez que abre un terminal, debe realizar los cambios en su
~/.bashrc
lugar. Alternativamente, también puede colocar sus alias en el archivo~/.bash_aliases
(sin embargo, tenga en cuenta que esta es una característica de Ubuntu y no debe esperar que funcione en otras distribuciones).Para obtener más detalles sobre qué archivo debe usarse para qué, consulte aquí .
NOTAS
Debian (y por extensión Ubuntu) también tiene la
~/.profile
fuente predeterminada~/.bashrc
. Esto significa que cualquier cambio que realice~/.bashrc
también será heredado por los shells de inicio de sesión, pero i) este no es el caso en todas las máquinas Linux / Unix y ii) lo inverso no es cierto, por lo que generalmente siempre debe trabajar con~/.bashrc
& co en lugar de~/.profile
o/etc/profile
.Además, una nota general sobre el uso, los cambios realizados en los archivos de configuración
/etc
afectarán a todos los usuarios. Por lo general, esto no es lo que desea hacer y debe evitarse. Siempre debe usar los archivos equivalentes en su directorio de inicio (~/
).Los diversos archivos de configuración se leen secuencialmente. Específicamente, para los shells de inicio de sesión, el orden es:
Esto significa que cualquier configuración sobre
~/.profile
sobrescribirá todo lo establecido en los archivos anteriores.fuente
echo $0
desde un terminal y si la salida tiene el prefijo "-", entonces está en un shell de inicio de sesión.bash -l
. En cualquier caso, ¿por qué es eso relevante? La pregunta no es sobre cómo verificar qué tipo de shell está ejecutando."$0"
expande a algo que comienza con-
, entonces sabes que tienes un shell de inicio de sesión. Pero lo contrario no es cierto: la ausencia de-
no garantiza que no esté en un shell de inicio de sesión. Las formas más comunes de iniciar shells de inicio de sesión le dan una ventaja-
, pero no todas.man bash
nos dice "Un shell de inicio de sesión es aquel cuyo primer carácter del argumento cero es a-
, o uno que comenzó con la--login
opción". (-l
es la forma abreviada de--login
; son equivalentes ). En Bash puede ejecutarshopt login_shell
para verificar.Otra posibilidad, especialmente para los ajustes como los ajustes de historia
HISTSIZE
,HISTFILESIZE
,HISTCONTROL
, yPS1
es que los archivos se cargan, pero los ajustes se sobrescriben en otro archivo que es fuente posterior, siendo la causa más probable~/.bashrc
. (Tengo un conjunto predeterminado de configuraciones para nuestros servidores, como un mensaje en rojo para root para advertir al usuario y grandes historiales con marcas de tiempo)El valor por defecto de Ubuntu
.bashrc
de/etc/skel
conjuntos de varias configuraciones, que podría haber tenido sentido para fijar de algún lugar donde no anular los ajustes establecidos por el propietario del sistema de/etc/profile.d
(Al igual que/etc/bash.bashrc
) (Si un usuario edita su.bashrc
, está bien para sobrescribir la configuración, los archivos predeterminados del sistema son más molestos)fuente
en Debian para la sesión de Terminal resolví este problema para todos los usuarios, así que:
añadido a
bloquear
de
fuente
Sigue este camino:
fuente
VERSIÓN = "16.04.3 LTS (Xenial Xerus)"
De acuerdo, todos han asumido que la persona aquí no quiere /etc/profile.d/somefile.sh para todos los usuarios, pero en mi caso eso es exactamente lo que quería.
Entonces, en realidad, como resulta con Ubuntu si usa esto y desea que surta efecto en su shell gráfico, todo lo que tiene que hacer es configurar el archivo y luego cerrar sesión y volver a iniciarla. Todas sus consolas o cualquier cosa que inicie, ya sea tipo xterm o tipo de consola (o dejarlo en el shell) ahora tendrán ese archivo de origen.
No es necesario usar .bashrc, etc. para todos los usuarios. Lo siento, esto no estaba claro en la respuesta anterior. Todo lo que dijeron es cierto, pero en realidad no es cierto, ya que todo lo que inicia el administrador de Windows heredará esta configuración, así que solo vuelva a iniciar sesión y resuelva su problema y no se moleste con .bashrc, etc. si su intención es aplicarlo a todos los usuarios .
fuente