Aquí está la motivación para la pregunta:
Estoy usando Ubuntu 12.04 LTS 2 con el escritorio de Unity. En mi archivo .bashrc, agrego varios directorios a mi variable PATH y defino algunas variables de entorno, como JAVA_HOME. Cuando inicio aplicaciones desde una terminal (ejecutando bash, mi shell predeterminado), esto funciona muy bien, pero para varios de los accesos directos que usan el iniciador de Unity, ejecutan aplicaciones que parecen estar definidas para usar #! / Bin / sh, que tiene un alias para / bin / dash, y no recogen el contenido de ~ / .bashrc o ~ / .profile.
Supongo que podría cambiar todos estos accesos directos para usar / bin / bash en lugar de / bin / sh para forzarlo a recoger los cambios .bashrc, pero eso parece realmente extraño.
Dado que Ubuntu 12.04 (por defecto) alias / bin / sh a / bin / dash y que mi shell predeterminado es / bin / bash, ¿hay un solo lugar donde pueda elegir modificar la RUTA y definir variables de entorno si las quiero? estar presente en todas estas circunstancias:
- Cada vez que creo un shell bash sin inicio de sesión (usando la terminal en la unidad)
- Cada vez que creo un shell bash de inicio de sesión (por ejemplo, iniciar sesión de forma remota a través de ssh)
- Cada vez que uso un iniciador de aplicaciones de Unity (dado que el iniciador usa / bin / sh).
- Cada vez que se ejecuta un trabajo cron (dado que SHELL = / bin / sh en / etc / crontab).
Si entiendo correctamente, supongo que:
- (1) / (2) y (3) / (4) son diferentes porque (1) / (2) son bash y (3) / (4) son guiones.
- (1) y (2) son diferentes porque los archivos que bash elige cargar difieren dependiendo de si es o no un shell de inicio de sesión.
- (3) y (4) son diferentes porque (3) vendrá en algún momento después de haber iniciado sesión (y, por lo tanto, ~ / .profile habrá sido obtenido por uno de sus procesos principales, mientras que (4) vendrá en algún momento punto en el que estoy , no inscrito, y por lo tanto ~ / .profile no habrá sido leída.
(No me sorprendería si también importan otros factores, como si el shell es interactivo o no, por lo que probablemente haya más combinaciones que ni siquiera había previsto ... Estoy feliz de que mi pregunta "mejore" " en ese caso.)
Esperaría que en algún momento, alguien debe haber hecho algún tipo de guía que le diga cómo / dónde modificar las variables de entorno de una manera independiente del shell (o al menos una forma compatible con guiones / bash) ... Simplemente puedo ' Parece que no encuentra los términos de búsqueda correctos para ubicar dicha guía.
¡Soluciones o punteros a soluciones muy apreciadas!
Actualizado:
- Aclaración: este es el usuario predeterminado de Ubuntu creado por el proceso de instalación 12.04, por lo que no es nada lujoso. Que no tiene un ~ / .profile (que explícitamente fuentes de ~ / .bashrc), y la única ~ / .bash * archivos presentes son .bashrc, .bash_history y .bash_logout ... por lo que no hay ninguna .bash_profile.
- Énfasis en el alcance: Realmente no me importan los shells que no sean el shell interactivo predeterminado (bash) y cualquier script que use / bin / sh (con alias para el guión), por lo que no hay necesidad de complicar esto con nada extra para tcsh / ksh / zsh / etc. apoyo.
fuente
Respuestas:
La invocación de shell es algo complicado. Las páginas de manual de bash y dash tienen
INVOCATION
secciones sobre esto.En resumen, dicen (hay más detalles en la página del manual, deberías leerlo):
-
No sé sobre otros proyectiles de forma manual, ya que nunca uso ninguno de ellos. Su mejor opción podría ser establecer un par de variables de entorno para apuntar a la secuencia de comandos de ubicación común y obtenerla manualmente (cuando corresponda) en los dos casos que no cubren.
fuente
Entonces, hay varias formas de abordar esto. Muchas personas:
a. Tenga un archivo que tenga cosas comunes a todos sus shells de estilo sh, digamos
.shcommon
y en cada uno de los.profile
.bashrc
.kshrc
et cetra, solo obtenga esto con. .shcommon
si. Ponga todo
.profile
y obtenga esto de los otros archivos.Las cosas que se necesitan para shells específicos o para shells interactivos versus no interactivos pueden ir al archivo apropiado antes de obtener
.shcommon
Personalmente, no me gusta administrar varios archivos. Entonces, uso el siguiente enfoque:
Primero, todo lo que necesito entra
.profile
Ya que tengo algunas cosas específicas de bash y ksh, determino el nombre de shell actual usando lo siguiente:y luego tener comandos para shells específicos en algo como lo siguiente (algunos preferirían una declaración de caso).
Si tengo comandos que solo deberían ejecutarse en shells interactivos, utilizo lo siguiente:
Las cosas que son comunes en todas las conchas de estilo sh, por ejemplo,
PATH
pueden ir a la cima.Luego, uso enlaces simbólicos para cargar este mismo archivo en todos los shells de estilo sh:
Un par de notas al margen, si tiene un
.bash_profile
, entonces bash cargará esto en lugar de.profile
dash y ksh aún se cargará.profile
Esto puede ser parte de su problema.Además, es posible que desee considerar el uso
#!/bin/bash
en sus scripts en lugar de a#!/bin/dash
menos que realmente quiera scripts compatibles con POSIX. bash tiene muchas características adicionales que son muy agradables y se invoca dash o bash ya que sh deshabilitará muchas de estas características.Además, la página de manual de bash hace un buen trabajo de explicar al
.profile
frente.bashrc
se carga. Reglas similares se aplican a ksh. dash se carga.profile
al iniciar sesión y le permite cargar un archivo al inicio de shells interactivos que se especifica utilizando laENV
variable de entorno en.profile
(consulte también la página de manual de dash y busque .profile).fuente
$0
y me encontré con problemas ... Sin embargo, parece que no recuerdo exactamente lo que eran. Iniciar sesión directamente en la consola se muestra$0
como en-bash
lugar de,bash
pero eso podría remediarse.$-
también funcionaría. ¿Tendría que pensar cuándo tendría un shell interactivo sin un tty? Su solución tiene una mejor "sensación" por alguna razón, puedo cambiar eso.-
en-bash
medio "login shell", pero sí que habría que dar cuenta de que, en los lugares donde se prueba el valor o desea mostrar a alguien.Dado que los casos (1) y (2) se resuelven obteniendo mis variables de entorno en .bashrc y .profile, la verdadera pregunta es "¿cuál es el nombre del archivo donde obtengo estas mismas variables para (3) y (4)?
Parece que hay una respuesta a la parte (3) de la pregunta (¿cómo consigo que la variable de entorno se importe en el escritorio de Unity?) En askubuntu . La sugerencia es crear un archivo ~ / .xsessionrc que será obtenido por / etc / X11 / Xsession. (He probado esto, y parece funcionar ... ¡sí!)
Todavía estoy perplejo por qué hacer para (4). Seguramente, si creo un trabajo cron (o demonio), puedo reemplazar '/ bin / foo' con algo como 'bash -i -c / bin / foo' para obligarlo a usar bash para cargar las variables de entorno correctas, pero Esto también significa que tendré que jugar con cualquier herramienta de terceros que pueda instalar tareas de daemon o trabajo cron en mi nombre. Yuk
fuente