문제

할 수 있는 사람이 동작을 설명한?실행

#!/bin/sh
echo "hello world" | read var1 var2
echo $var1
echo $var2

결과 인도 출력하는 동안,:

#!/bin/sh
echo "hello world" > test.file
read var1 var2 < test.file
echo $var1
echo $var2

생산 예상 출력:

hello
world

지 관 않는 한 단계에서 무엇을 리디렉션을 테스트하고 있습니다.파일에 한 두 번째 예?가 동일한 코드와 모두와 bash 쉘과 동일한 동작습니다.

도움이 되었습니까?

해결책

최근에 추가 bashlastpipe 옵션을 수 있는 마지막 명령에 파이프라인에서 실행되는 현재의 쉘,아이점이 존재한다.을 때,작업 통제이 비활성화됩니다.

#!/bin/bash
set +m      # Deactiveate job control
shopt -s lastpipe
echo "hello world" | read var1 var2
echo $var1
echo $var2

실제로 출력

hello
world

다른 팁

#!/bin/sh
echo "hello world" | read var1 var2
echo $var1
echo $var2

출력이 없기 때문에 실행 파이프라인의 각각의 구성 요소를 내부에 장 한 다.Subshells 상속 복사 부모의 쉘의 변수,오히려 그들을 공유.이것을 보십시오:

#!/bin/sh
foo="contents of shell variable foo"
echo $foo
(
    echo $foo
    foo="foo contents modified"
    echo $foo
)
echo $foo

괄호 정의하는 지역의 코드를 가져오는 것이 좋습니다 실행에,그리고$foo 유지 원래 값으로 수정되고 있다.

지금 이것을 시도하십시오:

#!/bin/sh
foo="contents of shell variable foo"
echo $foo
{
    echo $foo
    foo="foo contents modified"
    echo $foo
}
echo $foo

이 교정기는 순수하게 그룹화에 대한 아이점이 존재한다.을 만들고,$foo 수정 중괄호 안에 동일하$foo 수정된 그 밖에.

지금 이것을 시도하십시오:

#!/bin/sh
echo "hello world" | {
    read var1 var2
    echo $var1
    echo $var2
}
echo $var1
echo $var2

중괄호 안에 읽기 내부를 만듭$var1 및$var2 제대로 볼 수 있는 것들이 얻을 에코.중괄호 외부에,그들은 존재하지 않는다.모든 코드를 중괄호 안에서 실행되었에 기 때문에 그것은 하나 구성 요소의 파이프라인.

를 넣을 수 있는 임의의 코드 사이에 괄호를 사용할 수 있도록 이관으로--블록 건설하고 필요할 때마다 실행하의 블록 쉘 스크립트를 구문 분석하는 출력의 다른 뭔가가 있습니다.

이것은 이미 제대로 대답하지만,이 솔루션은 명시되지 않은 아직입니다.사용 ksh,지 않는다.Compare:

$ echo 'echo "hello world" | read var1 var2
echo $var1
echo $var2' | bash -s

하기:

$ echo 'echo "hello world" | read var1 var2
echo $var1
echo $var2' | ksh -s
hello
world

ksh 한 프로그래밍 쉘 때문에 작은 미묘한 다음과 같다.(bash 은 더 나은 상호 작용하는 쉘입니다,in my opinion.)

read var1 var2 < <(echo "hello world")

포스트는 제대로 대답하지만,나는 대안을 제공하기 위해선 중 하나는 아마도 될 수있는 일부 사용.

에 대한 할당을 공백으로 구분한 값에서 에코(또는 표준출력으로 그 문제에 대한)껍질 변수를 고려할 수 있습 셸을 사용하여 배열:

$ var=( $( echo 'hello world' ) )
$ echo ${var[0]}
hello
$ echo ${var[1]}
world

이 예제에서 var 배열이 내용을 사용하여 액세스할 수 있습니다 construct${var[index]},는 인덱스는 배열 색인(0 부터 시작).

는 방법으로 할 수 있습으로 많은 매개변수는 당신이 원하는대로 할당한 관련 배열 색인.

내을 이 문제에 대한(사 Bash):

read var1 var2 <<< "hello world"
echo $var1 $var2

무사,내가 알았어요!

이것은 하드 버그를 잡을,그러나 결과는 방법으로 파이프를 처리합니다.모든 요소의 파이프라인에서 실행되며 별도로 처리됩니다.을 때의 읽기 명령어 집합을 var1 및 var2,은 그들을 설정 그것은 그것의 자신의점이 존재한다.하지 부모 쉘입니다.그래서 때점이 존재한다.구의 값 var1 및 var2 을 잃게 됩니다.당신은 할 수 있습니다,그러나,일을보십시오

var1=$(echo "Hello")
echo var1

를 반환하는 예상한 대답합니다.불행하게도 이만 작품에 대한 하나의 변수를 설정할 수 없습니다 많은 시간이다.를 설정하기 위해서는 여러 변수의 시간에서 다음 중 하나를 수행해야 합니다 읽을 하나의 변수로 들어온것으로 여러 변수 또는 다음과 같은 코드를 사용하면 됩니다:

set -- $(echo "Hello World")
var1="$1" var2="$2"
echo $var1
echo $var2

나는 그것을 인정하지 않으로 파이프를 사용하여,그것은 작동합니다.물론 당신은 유지해야 하는 마음에 읽고 의미하는 파일에서 읽으로 변수,그래서 그것을 만드는 표준입력에서 읽어야 합 조금 어렵습니다.

그것 때문에 관 버전을 만들이점이 존재한다.을 읽은 변수로 지역 공간에는 다음이 파괴할 때점이 존재한다.종료됩니다.

다음 명령을 실행합니다

$ echo $$;cat | read a
10637

사용 pstree-p 보 프로세스를 실행하는,당신은 여분의 쉘을 거의 당신의 주요 쉘입니다.

    |                       |-bash(10637)-+-bash(10786)
    |                       |             `-cat(10785)

Try:

echo "hello world" | (read var1 var2 ; echo $var1 ; echo $var2 )

문제로 여러 사람들을 읽을 수 있는 var1 및 var2 만들에 환경 파괴할 때는점이 존재한다.종료됩니다.위의 방지를 파괴하는점이 존재한다.까지 그 결과가 에코습니다.다른 해결책입니다:

result=`echo "hello world"`
read var1 var2 <<EOF
$result
EOF
echo $var1
echo $var2
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top