파이프라인에서 변수 할당이 작동하지 않습니다.

파이프라인에서 변수 할당이 작동하지 않습니다.

파이프될 때 변수에 값이 할당되지 않는 이유는 무엇입니까? 예를 들어:

a=15|echo $a

명령을 그룹화하여 {}파이프에 전달하려고 시도했지만 {}파이프 뒤의 명령은 초기화된 값을 사용할 수 없습니다.

답변1

이 명령은 할당이 출력을 생성하지 않고 echo표준 입력에서 읽지 않기 때문에 거의 의미가 없습니다.

대신에:

a=15; printf '%s\n' "$a"

그 외에도 파이프라인의 두 부분은 서로 다른 환경에서 실행되므로 a왼쪽을 설정해도 a파이프라인 오른쪽의 값에는 영향을 미치지 않습니다.

예:

{ a=15; printf 'on the left:\ta=%s\n' "$a"; } | { cat; printf 'on the right:\ta=%s\n' "$a"; }

산출:

on the left:    a=15
on the right:   a=

... a위의 작업을 수행하기 전에 값이 없다고 가정합니다. 그렇다면 오른쪽이 값을 얻게 됩니다. 파이프라인의 어느 부분에서나 값을 설정해도 a주변 환경의 값은 변경되지 않습니다.

lastpipe쉘 옵션이 설정된 경우그리고셸은 작업 제어 없이 실행되며(비대화형 스크립트인 것처럼) 파이프라인의 마지막 부분은 주변 스크립트와 동일한 환경에서 실행됩니다. 이는 할당이 파이프라인에서 "라이브"된다는 것을 의미합니다.

#!/bin/bash

shopt -s lastpipe

a=10

printf 'LHS: a=%s\n' "$a" | { cat; printf 'RHS: a=%s\n' "$a"; a=30; }

printf 'a is now %s\n' "$a"

산출:

LHS: a=10
RHS: a=10
a is now 30

삭제 shopt -s lastpipe:

LHS: a=10
RHS: a=10
a is now 10

답변2

귀하의 예는 이해가 되지 않지만 더 나은 예를 들어 보겠습니다.

echo foo | read REPLY

pipes(예상하는 방식으로) 작동할 수 있는 셸 구성이거나 POSIX가 셸에서 이를 설정하는 특정 방법을 허용하지 않기 때문에 작동하지 않을 수 있습니다.

내 예에서는 , 또는 을 사용하려고 시도하면 fooin 이 되며 다른 쉘에는 빈 쉘이 있을 것입니다.$REPLYboshksh93zshREPLY

이는 파이프의 가장 오른쪽 프로그램이 기본 쉘(내장 쉘인 경우)에서 실행되는 반면 bosh다른 쉘은 항상 서브쉘에서 가장 오른쪽 프로그램을 실행하여 응답을 읽은 다음 즉시 종료되기 때문입니다 .ksh93zsh

관련 정보