Por que o script com / bin / bash está funcionando, com / bin / sh não?

2

Meu amigo me perguntou por que este script simples não está funcionando nos dois shells:

Arquivo de teste "abc.txt":

aaa
111
bbb
111
ccc
111
ddd

Script nº 1 (a):

#!/bin/sh
while read -r line ; do
    echo "Processing $line"
done < <(grep 111 abc.txt)

Saída:

./a: line 4: syntax error near unexpected token '<'
./a: line 4: 'done < <(grep 111 abc.txt)'

Script nº 2 (b):

#!/bin/bash
while read -r line ; do
    echo "Processing $line"
done < <(grep 111 abc.txt)

Saída:

Processing 111
Processing 111
Processing 111

Eu verifiquei o bash e sh na minha máquina e se eu entendi isso correto, esta é a mesma coisa.

/ bin / sh é apenas um link para / bin / bash:

-rwxr-xr-x  1 root root 938736 May 10  2012 bash
lrwxrwxrwx. 1 root root      4 Feb 13 10:20 sh -> bash

Alguém pode me explicar onde está a diferença?

    
por Wolfy 18.02.2014 / 09:53

2 respostas

4

É porque o Bash se comporta de maneira diferente quando $0 é sh .

De Comportamento do Bash [Wiki do Bash Hackers] :

% bl0ck_qu0te%

Mais informações podem ser encontradas no Manual de Referência do Bash: Modo Bash POSIX especificamente:

% bl0ck_qu0te%

é por isso que o script sh está falhando, pois a sintaxe <(..) está usando a substituição do processo.

    
por kiri 18.02.2014 / 10:13
1

De acordo com

man bash

diz

When invoked as sh, bash enters posix mode after the startup files are read.

Portanto, você não pode usar recursos do bash quando executar seu script com /bin/sh .

    
por House Zet 18.02.2014 / 10:13