답변:
bash
서브 쉘 컨텍스트 에서 파이프 라인의 오른쪽을 실행 하므로 변수에 대한 변경 사항 (그것이 무엇인지 read
)은 유지되지 않습니다. 명령이 끝날 때 서브 쉘이 실행될 때 죽습니다.
대신 프로세스 대체를 사용할 수 있습니다 .
$ read a b dump < <(echo 1 2 3 4 5)
$ echo $b $a
2 1
이 경우 read
기본 셸 내에서 실행되고 출력 생성 명령이 하위 셸에서 실행됩니다. <(...)
구문 생성 하부 쉘 및 우리의 입력으로 리디렉션 파이프, 그 출력을 접속 read
통상적으로 <
동작 . read
기본 쉘에서 실행 되었으므로 변수가 올바르게 설정되었습니다.
주석에서 지적했듯이 문자열이 어떻게 든 문자열을 변수로 나누는 것이 목표라면 here 문자열을 사용할 수 있습니다 .
read a b dump <<<"1 2 3 4 5"
나는 그것보다 더 많은 것이 있다고 가정하지만, 이것이 없다면 더 나은 옵션입니다.
read a b dump <<< '1 2 3 4 5'
.
cat /etc/passwd | (read -r line ; echo $line)
. 그러나 그 echo
중 $line
파이프 라인에없는 것은 괄호 (subshell) 사이에 값이 있었기 때문에 화면에 아무것도 넣지 않았습니다. 희망, 그것은 누군가를 돕는다.
이것은 둘 다 와 동작 bash
을 POSIX
허용 하는 버그 가 아니므 로 관찰하고있는 불행한 불일치가 발생합니다.bash
ksh
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_12
또한 다중 명령 파이프 라인의 각 명령은 서브 쉘 환경에 있습니다. 그러나 확장으로 파이프 라인의 일부 또는 모든 명령이 현재 환경에서 실행될 수 있습니다. 다른 모든 명령은 현재 쉘 환경에서 실행됩니다.
그러나 bash 4.2
최신 버전에서는 lastpipe
대화식이 아닌 스크립트에서 옵션을 설정하여 다음과 같은 예상 결과를 얻을 수 있습니다.
#!/bin/bash
echo 1 2 3 4 5 | read a b dump
echo before: $b $a
shopt -s lastpipe
echo 1 2 3 4 5 | read a b dump
echo after: $b $a
산출:
before:
after: 2 1
lastpipe
는 다른 쉘 (예 : 대시)에서 작동하지 않는다는 것입니다. 기본적으로 해당 서브 쉘에서 모든 것을 실행하는 데있어 이식성이 부족한 방법은 없습니다. stackoverflow.com/questions/36268479/…