.profile e .bashrc não funcionam no meu Mac

29

Este problema eu tenho há muito tempo. Depois de executar o terminal .profile e o arquivo .bashrc não funciona (não é executado). Você poderia indicar onde eu deveria procurar formar uma fonte de problema?


fonte
verificar se estes arquivos têm permissões adequadas
sim ... você está certo, o motivo foi realmente estúpido - permissões incorretas chmod + x ~ / .profile e tudo está funcionando bem.
5
@xTrol: Isso não faz sentido, ~/.profilenão requer permissão de execução. (O shell o origina, não o executa). Tente chmod -x ~/.profilee veja se ainda funciona.
perfil completo de Keith Thompson

Respostas:

40

Eu tive um problema semelhante por .profilenão estar sendo executado. Acontece (como explicado nesta resposta do Apple StackExchange ) que, se você tiver .bash_profileou .bash_loginarquivos, .profileserá ignorado pelo bash.

pidge
fonte
2
Meu problema foi a instalação do Python, que criou automaticamente um arquivo .bash_profile, o que fez com que o meu .profile não fosse executado.
5
This answer helps me. .bash_login was added after I installed rvm.
17

Eu acho que essas perguntas e respostas devem ir para o Superusuário, mas de qualquer maneira:

De acordo com a seção INVOCATION da página de manual ,

  • /etc/profilee ~/.profileé lido para um shell de logon interativo e
  • ~/.bashrc é lido para um shell interativo sem logon.

Se sua outra máquina UNIX lê automaticamente ~/.bashrcmesmo para um shell de logon interativo, é porque o sistema /etc/ profiletem uma linha que lê ~/.bashrc. Todo o sistema do OS X /etc/profilenão possui um.

Portanto, se você deseja executar ~/.bashrcaté mesmo para um shell de login interativo, precisa incluir uma linha

. ~/.bashrc

no seu ~/.profile.

Yuji
fonte
E para preencher a peça que falta aqui: Um shell de terminal (que era a pergunta do OP) é ​​por padrão um shell de logon interativo.
Larsh
3

Tente fornecê-los "à mão":

source ~/.profile

e veja o que acontece. Observe que, como outros salientaram, .profile é obtido por shells de login, .bashrc por shells que não são de login; então tente um ou outro, não ambos.

Gordon Davisson
fonte
2

Nas preferências do seu terminal, verifique no painel 'Inicialização'. Você tem opções:

Os reservatórios abrem com:

  • Shell de login padrão (/ usr / bin / login)
  • Comando (caminho completo)

Eu escolhi o 'padrão' ... se você escolher o comando personalizado, isso pode ser um fator.

O próximo ponto a verificar é se o shell foi iniciado como um shell de logon. Quando faço uma pslistagem, vejo:

  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

O ponto chave aqui é o ' -' na frente do nome do shell; que diz ao shell para percorrer o perfil e coisas relacionadas. Se você não vê isso nas janelas atuais, pode precisar se preocupar com as configurações até conseguir.

O painel de configurações nas preferências do terminal também lista uma opção de shell. Eu tenho / bin / sh listado no meu.


Você não deveria precisar disso

Se o pior acontecer, você pode fazer o que eu fiz em outros sistemas não cooperativos no passado - eu criei um programa 'loginsh' que eu poderia executar no Windows e, por sua vez, executaria meu shell escolhido com o ' -' prefixo para dizer que funcione como um shell de login.

#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);
}

(O "stderr.h"cabeçalho e as err_*rotinas ' ' são um pacote de relatório de erros que eu uso em todos os lugares. A jlss_basename()função é basicamente a mesma que as versões fornecidas pelo sistema, como as encontradas no POSIX <libgen.h>.)

Jonathan Leffler
fonte
2

Boas informações acima, mas pensei em compartilhar alguns detalhes sobre o problema que tive e a solução que encontrei.

A necessidade: Adicione um diretório ao PATH no OSX 10.8 (ML).

O problema: as orientações costumam "modificar o perfil no seu diretório pessoal". Um pouco confuso, pois, por padrão, esse arquivo não existe no OSX. Duplamente confuso, porque depois de adicionar uma instrução de exportação para anexar o novo diretório ao PATH existente ... ele não funciona. Coberto acima.

A solução: eu adicionei a instrução de exportação ao meu .bash_profile (também no diretório inicial).

Tenho certeza que existem muitas maneiras de esfolar esse gato. Este funcionou para mim. Um pouco inspirador de confiança: o .bash_profile já existia e pude ver que outro software instalado (por exemplo, Ruby) o havia modificado. Se houver uma solução melhor, ficarei feliz em ouvir sobre isso!

tjim
fonte