파이프가있는 피드 소스 명령


25

이전에는 다음 source과 같은 명령을 사용 했습니다.

source file_name

그러나 내가하려는 것은 이것입니다.

echo something | source

작동하지 않습니다.

답변:


38

이후 source(또는 .) 인수로 파일을 소요, 당신은 시도 할 수 있습니다 :

source <(echo something)

1
효과가있었습니다. 감사합니다. 그리고 새해 복 많이 받으세요!
Desmond Hume

@muru 이것은 잘 작동합니다. 참고 "| 소스는 / dev / 표준 입력의"가 등장 작업을하지만, 실제로 변수 할당을 모두 삭제할 수 있습니다. 이유가 확실하지 않습니다. 이론적으로 견고합니다. 광기입니다.
더스틴 오프 레아

2
@DustinOprea 파이프는 서브 쉘을 작성하므로 모든 변수 지정은 상위 쉘에 영향을 미치지 않습니다.
muru

8

소스 명령에는 파일 인수가 필요합니다. 프로세스 대체로 일부 쉘에서이를 얻을 수 있으며 이는 쉘이 동일한 방식으로 대체하기 때문입니다.

arg=$(echo hi)

echo서브 쉘의 출력과 함께 명령 행에 있는 비트는 프로세스 대체의 경우 서브 쉘을 명명 된 파일 (보통 /dev/fd/62또는 무언가-파일 디스크립터에 대한 링크)로 대체합니다 . 파이프를 사용하면 파일 설명자가 0이므로 ...

echo 'echo hi' | . /dev/fd/0

... /dev/stdin또는 모든 경우에 리눅스 시스템과 다른 많은 시스템에서 잘 작동해야합니다. 다음 문서와 유사하게 사용할 수도 있습니다.

. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI

다음과 같은 방법으로 쉘이 프로세스 대체를 처리하는 방식을 확인할 수 있습니다.

(set -x; readlink <(:))

... 어떤 인쇄 (의 bash) :

+ set +x
+ readlink /dev/fd/63
++ :
pipe:[2212581]

... 그래서 우리는 쉘이 대체를하고 readlink있고 파일 디스크립터 63에서 열리는 성가신 파이프에서 읽고 있음을 알 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.