소스 /dev/stdin이 예상대로 작동하지 않습니다.

소스 /dev/stdin이 예상대로 작동하지 않습니다.

이것이 작동 하는지 확인하기 위해 효과적인 간단한 테스트부터 시작해 보겠습니다 source /dev/stdin.

# echo -ne 'echo a\necho b\n' | source /dev/stdin
a
b

이제 실제 기능을 얻고 싶습니다.

# echo -ne 'f() { echo a; }\n' | source /dev/stdin
# f
-bash: f: command not found

이제 임시 파일을 사용해 보겠습니다.

# echo -ne 'f() { echo a; }\n' > tempf
# source tempf
# f
a

이렇게 하면 임시 파일이 작동합니다. 하지만 제가 보기엔 매우 불편하고, 파이프가 제대로 작동하지 않는 타당한 이유가 보이지 않습니다.

# bash --version
GNU bash, version 4.2.53(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

완전성을 기하기 위해 실제 사용 사례는 젠투 포티지의 제한 사항을 해결하기 위해 포함될 파일 부분을 신중하게 선택하는 것입니다.

post_src_unpack() {
    if type epatch_user > /dev/null 2>&1; then
        epatch_user || die
    else
        awk \
            '/^# @FUNCTION: / { p = 0 } /^# @FUNCTION: epatch(_user)?$/ { p = 1; } p { print  }' \
            /usr/portage/eclass/eutils.eclass | source /dev/stdin || die
        epatch_user || die
        unset epatch
        unset epatch_user
    fi
}

이 코드의 목적은 많은 수의 함수가 포함된 소스 파일에서 두 개의 필수 함수를 추출하여 epatch현재 epatch_user셸에서 사용할 수 있도록 만들고 그 중 하나를 실행한 다음(다른 하나를 사용함) 삭제하는 것입니다. 궁극적인 목표는 상속된 ebuild만 eutils접근할 수 있는 Gentoo의 한계를 해결하는 것입니다 epatch_user.

답변1

당신은 그것을 사용할 수 있습니다프로세스 교체

source /dev/stdin < <(echo -ne 'f() { echo a; }\n')

또는

source <(echo -ne 'f() { echo a; }\n')

이것은 bash 4.1.5에서 작동하지만 어떤 이유로 3.2.48에서는 작동하지 않습니다.

답변2

각 부분관로뛰어들다별도의 프로세스 또는 자체 하위 쉘. 따라서 파이프라인이 완료되면 현재 셸은 함수에 대해 아무것도 모릅니다 f.

bash( ksh, pdksh또는 쉘을 사용 zsh하여 mksh지원여기에 있는 문자열),당신이 사용할 수있는:

$ source /dev/stdin <<<'f() { echo a; }'
$ f
a

POSIXly, 당신은 사용해야합니다여기 문서그리고가리키다:

$ . /dev/stdin <<'EOF'
> f() { echo a; }
> EOF

$ f
a

답변3

/dev/stdin파이프라인의 명령은 별도의 프로세스이므로 파이프라인이 완료되면 파생된 함수 정의가 손실됩니다. 이것이 파이프가 임시 파일을 사용한 것과 다른 결과를 나타내는 이유입니다.

귀하의 사용 사례에서는 evalPM 2Ring이 제안하는 접근 방식이 최선의 선택이 될 것입니다.

관련 정보