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

이것은 둘 다 와 동작 bash을 POSIX허용 하는 버그 가 아니므 로 관찰하고있는 불행한 불일치가 발생합니다.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.