GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué las personas obtienen bash_profile de bashrc en lugar de al revés?

Las personas obtienen bash_profile de bashrc en lugar de al revés debido a la convención local .

Toda la opinión que he leído sobre cómo uno configura sus archivos de inicio en 05 se basa principalmente en la convención local. La convención local generalmente no menciona el panorama general en el sentido de que no habla mucho sobre el caso de no inicio de sesión, no interactivo. Lo curioso es que he mirado, pero rara vez veo a alguien mencionar 18 en toda su charla sobre por qué poner variables en un archivo de inicio frente a otro. De hecho, no he escuchado ningún comentario que diga:"/bin/sh está ahí por una razón. Bash emula el shell original de Bourne, /bin/sh, cuando se invoca como tal. " Por un lado, y me estoy desviando un poco, este caso es importante para las personas que trabajan con el shell no solo de forma interactiva, sino que también brindan acceso no interactivo y sin inicio de sesión (desatendido). o fondo ) 20 scripts que necesitan un procesamiento de shell mínimo, es decir, el procesamiento en segundo plano no requiere las sutilezas de las indicaciones en color, el historial de comandos y la sustitución, una variable $TERM definida correctamente, etc.

Además y con respecto a 37 , lo que normalmente veo es gente que crea rutas de búsqueda mínimas o llama a programas completamente calificados, y no sabe cómo manejar la salida que no está conectada a un terminal (es decir, el 47 no interactivo y sin inicio de sesión o 54 caso) al trabajar con su 61 guiones. Esto generalmente se debe a que una buena comprensión de la secuencia de inicio del shell no se comprende completamente, lo que lleva a que un usuario implemente sus propios archivos de inicio de una manera que es inconsistente o incoherente con las convenciones ya establecidas en el 77 archivos de inicio.

Elaborando, la configuración realizada por convención local se presenta en esa instalación en particular y 81 del shell archivos Si uno examina el 93 de cualquier instalación de UNIX archivos, que se invocan como parte de un típico 106 secuencia de inicio, entonces uno debe crear su propia puesta en marcha de una manera que sea complementaria a la convención establecida en esos 113 archivos de inicio.

El Proyecto de Documentación de Linux establece:

/etc/skel/ Los archivos predeterminados para cada nuevo usuario se almacenan en este directorio. Cada vez que se agrega un nuevo usuario, estos archivos básicos se copian en su directorio de inicio. Un sistema promedio tendría:archivos .alias, .bash_profile, .bashrc y .cshrc. Otros archivos quedan en manos del administrador del sistema.

Aunque el 126 manual no menciona estos archivos que se encuentran comúnmente en el 133 directorio explícitamente, por lo que recuerdo, SunOS, Solaris, RedHat, Ubuntu, HP-UX, umips y Ultrix tienen 144 archivos para modelar los archivos de inicio de shell de un usuario después. OSX claramente no lo hace:estoy usando OSX 10.9.1 en este momento. Desafortunadamente, OSX no le da mucho para continuar en términos de cómo deben configurarse las cosas en términos de convención, pero dado que OSX es un derivado de BSD, simplemente usé otro derivado de BSD y modelé mi propio 159 secuencia de inicio después de eso, ajustándola para que se ajuste a las convenciones locales utilizadas en OSX 10.9.1 167 archivos de inicio.

Un punto importante que se mencionó en un comentario paralelo es que para OSX, la convención es iniciar cada Terminal nuevo como un shell de inicio de sesión interactivo. De hecho, este es el valor predeterminado en OSX. No hay problema con esta convención siempre que los usuarios de una instalación sean consistentes. El comportamiento predeterminado de la Terminal en OSX se puede cambiar para cumplir con las convenciones de inicio de shell de otras distribuciones de UNIX haciendo el siguiente cambio en las preferencias de la Terminal , en particular, cambie la configuración, 176 para emitir el 185 comando:

Con todo eso como antecedente o introducción, pasaré a mi mejor consejo , por lo que vale.

Mi mejor consejo:

Examine los archivos que han instalado los administradores de su distribución UNIX. Comience con las siguientes ubicaciones, si existen. No olvides usar el 199 comando, porque algunos de los archivos comienzan con un punto. Vea cómo se usan estos archivos durante el inicio y vea cómo sus propios archivos de inicio interactúan con ellos:

/etc/bashrc
/etc/profile
/etc/skel/.bash_logout
/etc/skel/.bashrc
/etc/bash.bashrc
/etc/bash_completion

Mira en el 208 manual de invocación y secuencia de arranque. Todo está muy bien diseñado.

Con todo eso como advertencia, así es como hice las cosas en mi instalación de OSX 10.9.1:otras distribuciones de UNIX SERÁN diferentes, pero lo que se presenta a continuación debería funcionar en la mayoría, si no en todas, las distribuciones de UNIX, pero use esas otras distribuciones de UNIX. convención como guía para adaptar lo siguiente a sus propios propósitos:

.perfil

# ~/.profile: executed by the command interpreter for login shells.

# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.  Note, however, that we will have a ~/.bash_profile and it
# will simply source this file as a matter of course.

# See /usr/share/doc/bash/examples/startup-files for examples.
# The files are located in the bash-doc package.

# From here on out, I basically set up my PATH, LD_LIBRARY_PATH, and anything else I'd like
# global to running programs and how those programs find their libraries.  This is shared by
# `cron`, so we really don't want interactive stuff, here.  Also, I setup my environments
# for brew, macports, and fink here, essentially with setting PATH, and invocation of those
# package initialization file as in:

# Brew and locally compiled stuff:
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/sbin:$PATH

# The following line puts gnu utilities without the prefix "g" in the path
# i.e. tar/gtar:
export PATH=$PATH:/usr/local/Cellar/coreutils/8.21/libexec/gnubin

# MacPorts shoves stuff in /opt, so to get at that stuff...
export PATH=/opt/local/bin:$PATH
export PATH=/opt/local/sbin:$PATH

# Set up for using Fink, which lives in /sw:
[ -e /sw/bin/init.sh ] && . /sw/bin/init.sh

# My stuff:
export PATH=~/perl:$PATH
export PATH=~/bin:$PATH
export PATH=.:$PATH

.bashrc

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# From here on out, I put in things that are meaningful to interactive shells, like aliases,
# `shopt` invocations, HISTORY control, terminal characteristics, PROMPT, etc.

.bash_perfil

# ~/.bash_profile: executed by the command interpreter for login shells.

# Because of this file's existence, neither ~/.bash_login nor ~/.profile
# will be sourced.

# See /usr/share/doc/bash/examples/startup-files for examples.
# The files are located in the bash-doc package.

# Because ~/.profile isn't invoked if this files exists,
# we must source ~/.profile to get its settings:
if [ -r ~/.profile ]; then . ~/.profile; fi

# The following sources ~/.bashrc in the interactive login case,
# because .bashrc isn't sourced for interactive login shells:
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac

# I'm still trying to wrap my head about what to put here.  A suggestion
# would be to put all the `bash` prompt coloring sequence functions as
# described on http://brettterpstra.com/2009/11/17/my-new-favorite-bash-prompt/

Así que esos son mis dos centavos. Tenga en cuenta que mis ejemplos han tratado de mostrar la ruta de control a través de los archivos de inicio y evitar lo que puedan imponer las convenciones de un sitio en particular.


¿Por qué ponemos todo en bash_profile en primer lugar?

.profile fue utilizado originalmente por /bin/sh, el uso de .profile permite la compatibilidad con versiones anteriores.

A menos que esté usando Mac, no todo se pone en bash_profile. Se pone en bashrc

¿No tendría más sentido y sería más consistente con la comunidad de Linux poner todo en bashrc y tener la fuente bash_profile?

Es común colocar información del sistema en el shell que se carga cuando se conecta a la máquina (tiempo de actividad, paquetes que necesitan actualización, temperatura de la CPU, etc.). Si bashrc obtuviera bash_profile, vería toda esa información cada vez que abriera un nuevo shell.

En Unix:

.bash_profile se carga mediante shells de inicio de sesión
.bashrc se carga mediante shells interactivos

Excepto para Mac, que carga el shell de inicio de sesión para cada terminal nuevo (interactivo o no)

Recursos adicionales

diferencia entre bashrc y bash-profile

¿Dónde se especifican las variables de entorno?


[...] Estoy confundido, ¿por qué preferir bash_profile es el estándar?

¿Quién dice que es el estándar? El propio manual de Bash tiene esto que decir sobre el tema:

Entonces, normalmente, su ~/.bash_profile contiene la línea

si [ -f ~/.bashrc ]; después . ~/.bashrc; fi

después (o antes) de cualquier inicialización específica de inicio de sesión.


Linux
  1. ¿Permitir que otro usuario copie los archivos de la carpeta?

  2. ¿Qué forma de evitar que Kde sobrescriba las otras configuraciones de Wm?

  3. Migración de un servidor Linux desde la línea de comandos

  4. La forma más rápida de pegar un bloque de texto en el editor vi desde una fuente externa

  5. Incluir archivos adicionales en .bashrc

Cómo instalar la última versión de OpenSSL desde Source en Linux

Cómo buscar archivos desde la Terminal en Linux

¿Por qué no instalar paquetes de software desde Internet?

La forma más rápida de contar archivos recursivamente en Linux

Manera fácil de fusionar archivos con el comando Cat

¿Hay alguna manera de cambiar una identificación de volumen de archivos .iso desde la línea de comando?