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.