쉘 스크립팅 용어의 확장과 대체의 차이점

쉘 스크립팅 용어의 확장과 대체의 차이점

확장그리고치환쉘 프로그래밍 언어와 동일한 맥락에서 상호 교환 가능한 것으로 보입니다. 예를 들어 다음과 같은 일부 문서는배쉬 참조 매뉴얼,배쉬 해커 위키"쉘 매개변수"를 설명하려면 "확장"이라는 단어를 사용하십시오.확장'. 그러나 일부 다른 문서에서는 "대체"라는 단어를 선호하는 것 같습니다.고급 Bash 스크립팅 가이드매개변수 사용대리자.

쉘 프로그래밍 용어에서 "확장"과 "교체" 사이에 차이점이 있습니까?

답변1

치환거의 동의어확장이 경우 의미가 겹치기 때문입니다. 어느 쪽도 다른 쪽의 완전한 하위 범주는 아니지만GNU 매뉴얼인용한 섹션에는 전체 확장의 일부로 간주되는 일부 대체 항목이 있습니다.

하나확장식별자 값을 추출합니다. 예를 들어, this=that확장하면 this을 얻습니다 that. 대체를 수반하지 않는 확장은 사용된 값이 이미 존재하므로 미리 결정되어 있으므로 단순히검색됨,여기에는 결합된 검색/명시적 값(예: "산술 확장")이 포함됩니다.

치환명시적 입력/출력 작업의 결과로 값을 생성합니다. 예를 들어 if 가 this=$(foo bar)실행되고 해당 출력이 캡처됩니다 this. 1 대체로 생성된 값은 완전히 예측 가능하지만 대체가 발생하기 전에는 실제로 존재하지 않기 때문에 일반 확장에서 검색된 값과 동일하지 않습니다.foo bar생산.

대체품은 두 가지 맛으로 제공됩니다.주문하다그리고프로세스, 다소 대칭적입니다.

# Command substitution
foo=$(ls)
# Process substitution
wc <(ls)

첫 번째의 "명령"은 ls이고 두 번째의 "프로세스"도 마찬가지입니다. 대체되는 것은 실제로 파이프의 끝이라고 말할 수 있습니다. 프로세스 대체 중복리디렉션. 그러나 이는 기술적으로 너무 제한적일 수 있으므로 각주로 이동합니다.


  1. foo bar이 경우 내부 쉘 기능일 수 있으며, 이 경우 프로세스 간 IO가 없습니다. 쉘 내장 기능이 있으면 이러한 차이가 덜 명확해집니다. 내용면에서 입력과 출력은 동일합니다.

답변2

set -- arg arg2
echo ${2+"$1"}
 #OUTPUT 
arg

shift
echo ${2+"$1"}
 #OUTPUT

 #there doesn't seem to be anything here

나는 그 차이가 일반적으로 너무 작아서 주목할 가치가 없다고 생각합니다. 그리고 두 용어는 종종 같은 의미로 사용됩니다. 그러나 위의 두 예를 보면 첫 번째 예에서 우리가바꾸다 $1왜냐하면 $2때문에확장$2. 일단은 $2할 수 없어확장하다아니요치환.

Goldilocks는 대안의 천상의 존재를 잘 보여줍니다. 슈뢰딩거의 고양이와 비슷한 것 같아요. 이것은 나에게 뭔가를 생각나게 한다. 이러한 POSIX 지정 매개변수 확장 형식에 익숙하지 않을 수도 있지만 위 형식과 반대로 작동합니다.

${var:?if $var is unset or null its \
     parent shell dies and this message is output to stderr}

이제 때로는 동일한 동작을 원하지만 가치가 있습니다 set. POSIX는 어떤 것의 동작도 명시적으로 지정하지 않습니다. 그러나 한두 가지 트릭을 사용하면 쉽게 관리할 수 있습니다.

N= #N is null
var="any value should fail"
${var:+${N:?we substitute our \$Null var when \$var is expanded}}
  #OUTPUT
sh: line 3: N: we substitute our $Null var when $var is expanded

하지만:

N= #N is null
var=
${var:+${N:?is never substituted}}
  #OUTPUT

#there doesn't seem to be anything here

관련 정보