bash에서 파이프가 값을 설정하지 않은 후 읽습니다.


22

편집 : 원본 제목은 "bash에서 읽기 실패"

ksh를 사용하면 값을 분리하는 편리한 방법으로 read를 사용하고 있습니다.

$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a 
2 1
$

그러나 bash에서는 실패합니다.

$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a 

$

매뉴얼 페이지에서 실패한 이유를 찾지 못했습니다.


2
이것은 Greg 's Bash FAQ의 024 페이지 에서 (어쩌면 모호하게) 논의 됩니다.
Scott

답변:


27

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"

나는 그것보다 더 많은 것이 있다고 가정하지만, 이것이 없다면 더 나은 옵션입니다.


3
또는 심지어 read a b dump <<< '1 2 3 4 5'.
choroba

btw 나는 mksh (cygwin에서)가 bash와 동일하게 작동한다고 언급했다.
Emmanuel

@ 마이클 호머 좋은 설명! 파이프 라인의 모든 명령이 자체 하위 쉘에서 실행된다는 것을 설명 할 수있는 또 다른 예를 찾았습니다 cat /etc/passwd | (read -r line ; echo $line). 그러나 그 echo$line파이프 라인에없는 것은 괄호 (subshell) 사이에 값이 있었기 때문에 화면에 아무것도 넣지 않았습니다. 희망, 그것은 누군가를 돕는다.
유리 곤 차룩

17

이것은 둘 다 와 동작 bashPOSIX허용 하는 버그 가 아니므 로 관찰하고있는 불행한 불일치가 발생합니다.bashksh

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

1
"lastpipe"정보에 대해 +1 감사합니다. 지연해서 죄송합니다
Emmanuel

1
문제 lastpipe는 다른 쉘 (예 : 대시)에서 작동하지 않는다는 것입니다. 기본적으로 해당 서브 쉘에서 모든 것을 실행하는 데있어 이식성이 부족한 방법은 없습니다. stackoverflow.com/questions/36268479/…
anarcat

1
@anarcat 이것은 정확하지만 여기서 묻는 질문은 bash에 관한 것입니다.
jlliagre

@anarcat는 : 또 다른 이유 (PIPE 상태)에 대한 POSIX를 변경하는 소원 있기 때문에이 여기에서 보는 향후 변경 될 수 있습니다 : unix.stackexchange.com/questions/476834/...가 다른 쉘을 변경하면 사소한 아니라, 몇 달이 걸렸다 Bourne Shell (bosh)에서 파서와 대화를 다시 작성하여 최신 ksh의 빠른 동작을 구현합니다.
schily
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.