Resultados diferentes invocando bash diretamente ou via soft link

0

No meu sistema Red Hat Linux /bin/sh é um link para bash

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Sep 27 13:17 /bin/sh -> bash

A execução desse programa de teste diretamente me dá a resposta esperada

$ cat ./test.sh
#!/bin/sh
# Just a test program to illustrate an issue
case "b" in
    (a)   echo "a"; break;;
    (b)   echo "b"; break;;
    (c)   echo "c"; break;;
esac

$ ./test.sh 
b

Mas explicitamente executá-lo em bash , ou alterar a linha inicial para invocar bash dá um erro. Eu entendo que isso pode ser um erro real de bash - mas por que a diferença?

$ /bin/bash ./test.sh
b
./test.sh: line 5: break: only meaningful in a 'for', 'while', or 'until' loop

$ sed -e 's/sh/bash/' test.sh > test1.sh
$ chmod 777 test1.sh
$ ./test1.sh
b
./test1.sh: line 5: break: only meaningful in a 'for', 'while', or 'until' loop
    
por timg 01.10.2014 / 18:11

2 respostas

1

Na página man de bash :

If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well.

No entanto, dizendo isso, a definição POSIX de break não inclua o uso em um bloco case .

A página man também indica (sob a definição de case ):

If the ;; operator is used, no subsequent matches are attempted after the first pattern match

E definição POSIX de case diz:

The conditional construct case shall execute the compound-list corresponding to the first one of several patterns

Portanto, a linha inferior é: você não precisa do break , pois o case para após a primeira correspondência.

    
por 01.10.2014 / 18:35
1

Na página do bash man:

If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well.

Ao contrário do C / C ++, você não precisa de break em uma instrução switch / case no shell script.

    
por 01.10.2014 / 18:29

Tags