Я пытался работать на Ubuntu 16 сценарий удара, который я разработал на CentOS 7.
Первая строка сценария:
set -o nounset -o pipefail -o errexit
Когда я пытаюсь запустить этот скрипт, я получаю следующую ошибку:
project.sh: 6: set: Illegal option -o pipefail
Как решить эту проблему? Я также решение объясняет в ответе на этот вопрос, но это не помогло (мой файл не является a make
).
На Ubuntu оболочка по умолчанию dash
(иначе Debian Almquist Shell), на который /bin/sh
символьная ссылка. Когда Ваш сценарий оболочки выполняется с #!/bin/sh
, Вы эффективно пытаетесь выполнить его с оболочкой по умолчанию. Однако dash
не имеет pipefail
опция, которая является, почему Вы получаете ошибку.
# 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
Для тех, кто ищет простой сценарий, позволяющий обойти проблему тире
в Ubuntu, вы можете использовать
bash | set +o pipefail