'set -opipelinefail' 제공을 담당하는 사람은 누구입니까?

'set -opipelinefail' 제공을 담당하는 사람은 누구입니까?

내 스크립트에서 엄격 모드를 사용하고 싶습니다. 휴대성도 인정합니다.

set -o 파이프라인 실패필수인 것 같습니다. 그러나 shellcheck(정적 린터)는 "POSIX sh에서 파이프라인 실패 설정 옵션이 정의되지 않았습니다"라는 내용에 만족하지 않습니다.

맞아? 그렇다면 이것은 단지 bash기능일까요, 아니면 꽤 풍부한 것일까요?

답변1

pipefail옵션은 ksh93에서 제공되며 일부 다른 셸에도 있습니다. 추가됨:

POSIX 표준에 추가되도록 요청2013년에 제출되었고 2019년에 결의안이 승인되었습니다. 따라서 이는 표준의 다음 주요 개정판에 속하게 됩니다.

나머지 구현(주로 dash, bosh 및 ksh88 기반 셸)에 대한 지원을 추가하려면 여전히 더 많은 시간이 필요할 수 있습니다. 그 후 "EOL" 시계가 작동하기 시작하고 10년 후에는 현재 지원되는 시스템의 모든 sh 구현이 이를 지원한다고 가정할 수 있습니다.

답변2

쉘 옵션은 1 을 지원한다고 pipefail주장하는 많은 쉘에만 적용됩니다 . "이식성"에 따라 대상 시스템이 이를 지원하는 셸(및 사용할 수 있는 다른 구성)을 가질 것이라고 가정하는 경우 이 셸 옵션을 사용하여 이식성을 얻을 수 있습니다. 이는 다른 특정 스크립트 언어에서 얻을 수 있는 것과 동일한 유형의 "이식성"입니다.shellcheck

linter가 쉘 스크립트 내에서 스크립트를 찾으면 shellcheckPOSIX가 현재 이를 지원하지 않기 때문에 불만을 표시합니다.set -o pipefailshsh

bash스크립트가 쉘(또는 코딩하려는 특정 쉘)에 의해 해석되는 스크립트인지 확인하려면 스크립트에 #!올바른 쉘 해석기를 가리키는 -line이 있어야 합니다. 예:

#!/bin/bash

아니면 어쩌면

#!/usr/bin/env bash

또는 그런 것.

올바른 #!행을 사용하면 스크립트가 해석되지 않는 특정 쉘에 의해 해석되고 linter가 스크립트에 설정한 쉘 옵션에 대해 불평하지 않는다는 것을 추가로 sh나타 냅니다 shellcheck.pipefail

#!스크립트에서 -line을 사용 하지 않는 경우 그렇게 하는 것을 고려해야 합니다(또는 항상 명시적 해석기를 사용하여 명령줄에서 스크립트를 실행해야 합니다). 동시에 shellcheck명령줄 도구에 해당 (또는) 옵션을 사용하여 모드로 전환하도록 지시할 수 있습니다.-s--shell=

shellcheck --shell=bash myscript

1 , ( 지원한다고 주장되지 않음 ) 을 지원하는 "POSIX 모드"와 "기타 모드" 가 있는 것 같습니다 . , 및 와 함께 사용 하도록 쉘 옵션이 문서화되어 있습니다 . 쉘에는 동일한 방식으로 설정할 수 있는 쉘 옵션이 있습니다 . 쉘은 이 옵션을 지원하지 않지만 -line이 언급 되어도 불평하지 않습니다 .shellcheckshbashdashkshshellcheckzshpipefailbashkshzshPIPE_FAILdash#!dashshellcheckpipefail

답변3

지원되지 않는 쉘에서 스크립트가 실행될 때 어떤 일이 발생하길 원하시나요 pipefail?

결과의 순서가 중요합니다일부그러나 껍질이 전부는 아닙니다. 단일 명령 내에서도 bash는 순서를 고려합니다 . VS가 종료될 set때까지 계속됩니다 .set -o NoSuchOption -eset -e -o NoSuchOption

관련 정보