O que é o modo compatível com POSIX no Linux?

3

O livro diz:

  

Quando no modo compatível com POSIX, bash   irá emular sh .

O que isso significa? O que se entende por emulação em termos leigos simples?

    
por Siddharth Thevaril 02.05.2016 / 11:21

1 resposta

5

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.

    
por terdon 02.05.2016 / 13:05