Isto não é uma coisa do Linux, é uma coisa bacana. Bash é apenas uma das muitas shells. Bash é o "Bourne again shell" e foi lançado como um substituto do original Bourne Shell, sh
.
POSIX é um conjunto de padrões que define como os sistemas compatíveis com POSIX devem funcionar. O padrão de shell POSIX pode ser encontrado aqui . O Bash tem muitos recursos não presentes em sh
e não é, na verdade, um shell compatível com POSIX.
É por isso que a opção --posix
é fornecida. Conforme explicado em man bash
(ênfase minha):
Se o bash é invocado com o nome sh, ele tenta imitar o comportamento de inicialização de versões históricas de sh tanto quanto possível, conformando-se também ao padrão POSIX. Quando chamado como um shell de login interativo ou um não interativo shell com a opção --login, primeiro tenta ler e execute comandos de / etc / profile e ~ / .profile, nesse ordem. A opção --noprofile pode ser usada para inibir essa comportamento. Quando chamado como um shell interativo com o nome sh, o bash procura a variável ENV, expande seu valor se for definido e usa o valor expandido como o nome de um arquivo para ler e execute. Desde um shell invocado como sh não tenta ler e executar comandos de qualquer outro arquivo de inicialização, o --rcfile opção não tem efeito . Um shell não interativo chamado com o nome sh não tenta ler nenhum outro arquivo de inicialização. Quando invocado como sh, o bash entra no modo posix após a inicialização os arquivos são lidos.
Quando o bash é iniciado no modo posix, como no comando --posix opção de linha, segue o padrão POSIX para arquivos de inicialização. Dentro Neste modo, shells interativos expandem a variável ENV e comandos são lidos e executados a partir do arquivo cujo nome é o valor expandido. Nenhum outro arquivo de inicialização foi lido.
Isso significa que se você executar sh
ou bash --posix
para iniciar um shell interativo, seu arquivo ~/.bahsrc
será ignorado e, em vez disso, o arquivo salvo como $ENV
(se houver) será lido. Para ilustrar, adicionei echo "read .bashrc"
ao meu ~/.bashrc
:
$ bash
read .bashrc ## message was printed, ~/.bashrc was read
$ sh
sh-4.3$ ## no message printed, ~/.bashrc was not read
Se eu definir agora $ENV
:
$ export ENV="~/.bashrc"
$ sh
read .bashrc
OBSERVAÇÃO IMPORTANTE : O Ubuntu escolheu tornar /bin/sh
um synlink para /bin/dash
. Dash é mais um shell e na verdade é compatível com POSIX. Isso significa que, para observar o comportamento que descrevi acima, você precisa usar um diferente sh
1 . No Ubuntu, você precisa criar um arquivo chamado sh
, que é um link simbólico para /bin/bash
:
$ ln -s /bin/bash ~/sh
Agora você tem um arquivo chamado sh
em seu diretório pessoal. Use isso para demonstrar as diferenças que expliquei acima:
$ ls -l ~/sh
lrwxrwxrwx 1 terdon terdon 9 May 2 14:03 /home/terdon/sh -> /bin/bash
$ ~/sh
read .bashrc
1 Na verdade, o comportamento parecerá o mesmo, ~/.bashrc
será ignorado, mas isso é apenas porque dash
não é bash
e não tem leitura de negócios o bash-specific ~/.bashrc
de qualquer maneira. No entanto, dash
também ignora $ENV
, portanto, você precisa usar o link para /bin/bash
para ver isso.