Quando executo uma imagem do Centos 7 Docker como esta
docker run -it centos:7 bash
Executar algo que usa Process Substitution está bem (como esperado, pois o Bash suporta a substituição de processos desde o início dos tempos - Bash 1.4.x na verdade).
Por exemplo:
while IFS= read -r test; do echo $test; done < <(cat anaconda-post.log)
Mas quando mudo para /bin/sh o mesmo código não funciona mais
/bin/sh
while IFS= read -r test; do echo $test; done < <(cat anaconda-post.log)
sh: syntax error near unexpected token `<'
Embora /bin/sh pareça ser Bash
/bin/sh --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
Mas então por que a substituição de processos não funciona mais? Outros recursos não POSIX parecem funcionar, embora
echo ${PATH//:/ }
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin
Sim,
bash
, quando chamado comosh
, é executado no modo POSIX, desabilitando todos os seus recursos apenas de bash. Do manual - Invocado com o nome shcom
posix
o modo ativado, recursos não padrão, como substituição de processo, não serão ativados. Consulte Bash POSIX Mode para ver seu comportamento completo em execução no modo.A partir da versão 5.1 do shell, as substituições de processos estão disponíveis no modo POSIX.
Algumas opções estão desabilitadas no modo POSIX do bash. Que é ativado quando
bash
é chamado comosh
. Na página de manual do bash:Mas na substituição do processo de versão
5.1
foi reativada no modo POSIXPortanto, para as versões atuais (você está usando 4.2 da sua auto-resposta agora apagada), a substituição do processo funciona mesmo se
bash
for chamada comosh
.O que é
/bin/sh
? Estamos falando sobre o legado do Unix aqui! Um pouco de história:sh
é o Bourne Shell, foi lançado em 1979 na versão 7 Unix. Ele ganhou popularidade com a publicação de The Unix Programming Environment por Brian Kernighan e Rob Pike - o primeiro livro publicado comercialmente que apresentou o shell como uma linguagem de programação em forma de tutorial.ksh
, o shell Korn originalmente escrito por David Korn, foi baseado no código-fonte original do Bourne Shell, era um meio-termo entre o shell Bourne ecsh
o shell C. Sua sintaxe foi extraída principalmente do shell Bourne, enquanto seus recursos de controle de trabalho se assemelhavam aos do shell C. A funcionalidade do Korn Shell original foi usada como base para o padrão de shell POSIX.bash
é o 'Bourne Again SHell'. A sintaxe Bash é um superconjunto da sintaxe do shell Bourne. A sintaxe Bash inclui ideias extraídas do Korn Shell e do shell C, como edição de linha de comando, ohistory
comando, a pilha de diretórios, as variáveis $RANDOM e $PPID e a sintaxe de substituição de comando POSIX $(…).Um ponto adicional - no Centos 7,
sh
é um link simbólico parabash
. Não há binário separado parash
.bash
,dash
,busybox
e provavelmente outros shells podem verificar a linha de comando com a qual foram iniciados e fingirão ser outra coisa como plainsh
se for assim que foram chamados. Este link simbólico permite que isso aconteça.Você sempre pode esperar
/bin/sh
estar lá e ser um shell básico.