내 스크립트에서 엄격 모드를 사용하고 싶습니다. 휴대성도 인정합니다.
set -o 파이프라인 실패필수인 것 같습니다. 그러나 shellcheck
(정적 린터)는 "POSIX sh에서 파이프라인 실패 설정 옵션이 정의되지 않았습니다"라는 내용에 만족하지 않습니다.
맞아? 그렇다면 이것은 단지 bash
기능일까요, 아니면 꽤 풍부한 것일까요?
답변1
이 pipefail
옵션은 ksh93에서 제공되며 일부 다른 셸에도 있습니다. 추가됨:
- toksh93g1998년 출시
- 쾅2004년에 출시된 3.0
- 2009년부터 비지박스 애쉬까지
- 2010년에는 비지박스로 조용해졌습니다.
- mksh에r46은 2013년에 출시되었습니다.
- zsh로2013년 5.0.3 출시
- 야쉬 2.42로2016년 출시
- 2017년에 NetBSD sh로 이전
- 2019년에 FreeBSD sh로 이전
- 2020년에 OpenBSD sh로 업그레이드
ㅏPOSIX 표준에 추가되도록 요청2013년에 제출되었고 2019년에 결의안이 승인되었습니다. 따라서 이는 표준의 다음 주요 개정판에 속하게 됩니다.
나머지 구현(주로 dash, bosh 및 ksh88 기반 셸)에 대한 지원을 추가하려면 여전히 더 많은 시간이 필요할 수 있습니다. 그 후 "EOL" 시계가 작동하기 시작하고 10년 후에는 현재 지원되는 시스템의 모든 sh 구현이 이를 지원한다고 가정할 수 있습니다.
답변2
쉘 옵션은 1 을 지원한다고 pipefail
주장하는 많은 쉘에만 적용됩니다 . "이식성"에 따라 대상 시스템이 이를 지원하는 셸(및 사용할 수 있는 다른 구성)을 가질 것이라고 가정하는 경우 이 셸 옵션을 사용하여 이식성을 얻을 수 있습니다. 이는 다른 특정 스크립트 언어에서 얻을 수 있는 것과 동일한 유형의 "이식성"입니다.shellcheck
linter가 쉘 스크립트 내에서 스크립트를 찾으면 shellcheck
POSIX가 현재 이를 지원하지 않기 때문에 불만을 표시합니다.set -o pipefail
sh
sh
bash
스크립트가 쉘(또는 코딩하려는 특정 쉘)에 의해 해석되는 스크립트인지 확인하려면 스크립트에 #!
올바른 쉘 해석기를 가리키는 -line이 있어야 합니다. 예:
#!/bin/bash
아니면 어쩌면
#!/usr/bin/env bash
또는 그런 것.
올바른 #!
행을 사용하면 스크립트가 해석되지 않는 특정 쉘에 의해 해석되고 linter가 스크립트에 설정한 쉘 옵션에 대해 불평하지 않는다는 것을 추가로 sh
나타 냅니다 shellcheck
.pipefail
#!
스크립트에서 -line을 사용 하지 않는 경우 그렇게 하는 것을 고려해야 합니다(또는 항상 명시적 해석기를 사용하여 명령줄에서 스크립트를 실행해야 합니다). 동시에 shellcheck
명령줄 도구에 해당 (또는) 옵션을 사용하여 모드로 전환하도록 지시할 수 있습니다.-s
--shell=
shellcheck --shell=bash myscript
1 , 및 ( 지원한다고 주장되지 않음 ) 을 지원하는 "POSIX 모드"와 "기타 모드" 가 있는 것 같습니다 . , 및 와 함께 사용 하도록 쉘 옵션이 문서화되어 있습니다 . 쉘에는 동일한 방식으로 설정할 수 있는 쉘 옵션이 있습니다 . 쉘은 이 옵션을 지원하지 않지만 -line이 언급 되어도 불평하지 않습니다 .shellcheck
sh
bash
dash
ksh
shellcheck
zsh
pipefail
bash
ksh
zsh
PIPE_FAIL
dash
#!
dash
shellcheck
pipefail
답변3
지원되지 않는 쉘에서 스크립트가 실행될 때 어떤 일이 발생하길 원하시나요 pipefail
?
결과의 순서가 중요합니다일부그러나 껍질이 전부는 아닙니다. 단일 명령 내에서도 bash는 순서를 고려합니다 . VS가 종료될 set
때까지 계속됩니다 .set -o NoSuchOption -e
set -e -o NoSuchOption