Кто отвечает за предоставление `набора -o pipefail`

Upstart был заброшен разработчиками, когда Ubuntu перешел на systemd, и был удален из Debian перед выпуском Debian 9.

Поддерживаемые системы инициализации в Debian 9 — это systemd, sysvinitи (, в гораздо меньшей степени)Runit , file-rcи openrc. Если вы хотите использовать systemd (, который по умолчанию является ), убедитесь, что пакеты systemdи systemd-sysvустановлены; чтобы использовать sysvinit, установите initscripts, sysv-rcи sysvinit-core.

Я не рекомендую использовать Upstart, так как он содержал ряд -критических ошибок, когда он был удален.

1
19.06.2021, 10:33
2 ответа

Параметр оболочки pipefailспецифичен для ряда оболочек, которые shellcheckутверждают, что поддерживают 1 . Вы можете использовать эту опцию оболочки и быть переносимой, если под «переносимостью» вы предполагаете, что любая целевая система имеет оболочку, которая поддерживает ее (и любые другие конструкции, которые вы можете использовать ). Это тот же тип «переносимости», который вы получаете с любым другим конкретным языком сценариев.

Линтер shellcheckбудет жаловаться, если обнаружит set -o pipefailв сценарии оболочки, который является сценарием sh, так как в настоящее время он не поддерживается POSIX sh.

Чтобы убедиться, что ваш сценарий интерпретируется оболочкой bash(или какой-либо конкретной оболочкой, для которой вы пишете код ), в сценарии должна быть строка #!-, указывающая на правильный интерпретатор оболочки, например,

#!/bin/bash

или, возможно,

#!/usr/bin/env bash

или что-то подобное.

С правильной строкой #!-, которая дополнительно указывает, что скрипт будет интерпретироваться конкретной оболочкой, отличной от sh, линтер shellcheckне будет жаловаться на то, что вы установили параметр оболочки pipefailв своем скрипте..

Если вы не используете строку#!-в своих сценариях, вам следует подумать об этом (или всегда запускать свои сценарии с явным интерпретатором в командной строке ). Между тем, инструменту командной строки shellcheckможно приказать переключиться в режим, используя его параметр-s(или--shell=):

.
shellcheck --shell=bash myscript

1Я подозреваю, что shellcheckимеет «режим POSIX sh» и «другой режим» для поддержки bash, dashиksh(shellcheckне претендует на поддержкуzsh). Параметр оболочки pipefailзадокументирован для работы с bashи ksh. Оболочка zshимеет параметр оболочки PIPE_FAIL, который можно установить таким же образом. Оболочка dashне поддерживает эту опцию, но если в строке#!-упоминается dash, shellcheckне будет жаловаться на pipefail.

6
28.07.2021, 11:23

Параметр pipefailвзят из ksh93, а также присутствует в нескольких других оболочках. Было добавлено:

Запрос на добавление его в стандарт POSIX был отправлен в 2013 г., а резолюция принята в 2019 г. Таким образом, он будет включен в следующую основную редакцию стандарта, которая должна быть выпущена в ближайшее время (не позднее 2022 г. ).

Для оставшихся реализаций (, в основном основанных на dash, bosh и ksh88 -оболочках ), вероятно, потребуется еще некоторое время, чтобы добавить его поддержку. После чего часы «EOL» начнут тикать, и через 10 лет вы сможете предположить, что все реализации sh в поддерживаемых в настоящее время системах будут его поддерживать.

8
28.07.2021, 11:23

Теги

Похожие вопросы