.profile y .bashrc no funcionan en mi Mac

29

Este problema lo tengo desde hace mucho tiempo. Después de ejecutar la terminal .profile, y el archivo .bashrc no funciona (no se ejecutan). ¿Podría indicar dónde debería buscar una fuente de problemas?


fuente
comprobar si estos archivos tienen unos permisos adecuados
sí ... tienes razón, la razón fue realmente estúpida: permisos incorrectos chmod + x ~ / .profile y todo funciona bien.
55
@xTrol: Eso no tiene sentido, ~/.profileno requiere permiso de ejecución. (El shell lo obtiene, no lo ejecuta). Intenta chmod -x ~/.profilever si aún funciona.
Keith Thompson el

Respuestas:

40

Tuve un problema similar con mi .profileno ser ejecutado. Resulta (como se explica en esta respuesta de Apple StackExchange ) que si tiene .bash_profileo .bash_loginarchivos, .profilebash lo ignorará.

pidge
fuente
2
Mi problema fue que instalé Python que creó automáticamente un archivo .bash_profile que hizo que mi .profile no se ejecute.
55
Esta respuesta me ayuda. .bash_loginfue agregado después de que lo instalé rvm.
17

Supongo que estas preguntas y respuestas deberían ir a Superuser, pero de todos modos:

De acuerdo con la sección INVOCACIÓN de la página del manual ,

  • /etc/profiley ~/.profilese lee para un shell de inicio de sesión interactivo, y
  • ~/.bashrc se lee para un shell interactivo sin inicio de sesión.

Si su otra máquina UNIX lee automáticamente ~/.bashrcincluso para un shell de inicio de sesión interactivo, es porque todo el sistema /etc/ profiletiene una línea que lee ~/.bashrc. El sistema operativo de OS X /etc/profileno tiene uno.

Por lo tanto, si desea ejecutar ~/.bashrcincluso un shell de inicio de sesión interactivo, debe incluir una línea

. ~/.bashrc

en su ~/.profile.

Yuji
fuente
Y para completar la pieza que falta aquí: un shell de Terminal (de lo que se trataba la pregunta del OP) es por defecto un shell de inicio de sesión interactivo.
LarsH
3

Intente obtenerlos "a mano":

source ~/.profile

y mira lo que pasa. Tenga en cuenta que, como otros han señalado, .profile se obtiene de shells de inicio de sesión, .bashrc de shells de no inicio de sesión; así que prueba uno u otro, no ambos.

Gordon Davisson
fuente
2

En las preferencias de su terminal, verifique en el panel 'Inicio'. Tienes opciones:

Los depósitos se abren con:

  • Shell de inicio de sesión predeterminado (/ usr / bin / login)
  • Comando (ruta completa)

He elegido 'predeterminado' ... si ha elegido el comando personalizado, eso puede ser un factor.

El siguiente punto a verificar es si el shell se inicia como un shell de inicio de sesión. Cuando hago un pslistado, veo:

  PID TTY           TIME CMD
24088 ttys000    0:00.03 -sh
24614 ttys001    0:00.03 -sh
25127 ttys002    0:00.05 -sh
35544 ttys003    0:00.08 -sh
40926 ttys004    0:00.03 -sh

El punto clave aquí es el ' -' delante del nombre del shell; eso le dice al shell que se ejecute a través del perfil y cosas relacionadas. Si no ve eso en sus ventanas actuales, es posible que deba manipular la configuración hasta que lo haga.

El panel de configuración en las preferencias del terminal también enumera una opción de shell. Tengo / bin / sh en la mía.


No deberías necesitar esto

Si lo peor llega a ser peor, puedes hacer lo que hice en otros sistemas no cooperativos en el pasado: creé un programa 'loginsh' que podía ejecutar desde Windows, y a su vez ejecutaría mi shell elegido con el ' -' prefijo para decirle que funcione como un shell de inicio de sesión.

#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "stderr.h"
#include "jlss.h"

#ifndef DEFAULT_SHELL
#define DEFAULT_SHELL   "/bin/sh"
#endif /* DEFAULT_SHELL */

#ifndef MAX_SHELLBASENAME
#define MAX_SHELLBASENAME   256
#endif /* MAX_SHELLBASENAME */

#ifndef lint
static const char sccs[] = "@(#)$Id: loginsh.c,v 4.2 2005/06/22 19:44:07 jleffler Exp $";
#endif

int main(int argc, char **argv)
{
    char     *shell;
    char      shellname[MAX_SHELLBASENAME];

    err_setarg0(argv[0]);

    /* Which shell to use? */
    if ((shell = getenv("SHELL")) == (char *)0)
        shell = DEFAULT_SHELL;

    /* Set up argv[0] in new argument list; reuse old argv space */
    shellname[0] = '-';
    strcpy(&shellname[1], jlss_basename(shell));
    argv[0] = shellname;

    /* Execv must work -- the shell must be an executable program */
    execv(shell, &argv[0]);
    err_syserr("cannot execute shell %s\n", shell);

    /* NOTREACHED */
    return(EXIT_FAILURE);
}

(El "stderr.h"encabezado y las err_*rutinas ' ' son un paquete de informe de errores que uso en todas partes. La jlss_basename()función es básicamente la misma que las versiones proporcionadas por el sistema, como las que se encuentran en POSIX <libgen.h>).

Jonathan Leffler
fuente
2

Buena información arriba, pero pensé que compartiría algunos detalles sobre el problema que tuve y la solución que encontré.

La necesidad: Agregar un directorio a PATH en OSX 10.8 (ML).

El problema: la orientación es a menudo "modifique el .profile en su directorio de inicio". Un poco confuso ya que, por defecto, este archivo no existe en OSX. Doblemente confuso porque una vez que agrega una declaración de exportación para agregar el nuevo directorio a la RUTA existente ... no funciona. Cubierto arriba.

La solución: agregué la declaración de exportación a mi .bash_profile (también en el directorio de inicio).

Estoy seguro de que hay muchas maneras de pelar a este gato. Este me funcionó. Algo inspirador de confianza: el .bash_profile ya existía y pude ver que otro software instalado (por ejemplo, Ruby) lo había modificado. ¡Si hay una solución mejor, me alegraría saberlo!

tjim
fuente