web-dev-qa-db-fra.com

"set -e -o pipefail" ne fonctionne pas sur le script bash sous Ubuntu 16

J'ai essayé d'exécuter sur Ubuntu 16 un script bash que j'ai développé sur CentOS 7.

La première ligne du script est:

set -o nounset -o pipefail -o errexit

Lorsque j'essaie d'exécuter ce script, le message d'erreur suivant s'affiche:

project.sh: 6: set: Illegal option -o pipefail

Comment résoudre ce problème? J'ai aussi la solution expliquer dans le réponse à cette question mais cela n'a pas aidé (mon fichier n'est pas un make).

6
DavideChicco.it

Sur Ubuntu, le shell par défaut est dash (aka Debian Almquist Shell), auquel /bin/sh est un lien symbolique. Lorsque votre script Shell est exécuté avec #!/bin/sh, vous essayez effectivement de l'exécuter avec le shell par défaut. Toutefois, dash ne dispose pas de l'option pipefail, raison pour laquelle vous obtenez le message d'erreur.

# Verifying what /bin/sh is symlinked to dash
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2月  17  2016 /bin/sh -> dash
# Verify that pipefail doesn't exist as option for dash
$ dash    
$ set -o | grep pipefail                                              
$ set -o pipefail
dash: 1: set: Illegal option -o pipefail
$ sh
$ set -o pipefail
sh: 1: set: Illegal option -o pipefail
# Try this same option in bash
$ bash --posix
bash-4.3$ set -o pipefail
bash-4.3$  
# no error
9
Sergiy Kolodyazhnyy