파일이 아닌 stdin (다른 프로그램의)에서 / bin / sh 소스


14

이것을 이름 짓기 까다로운 종류의 ...

기본적으로 STDOUT에서 쉘 변수 세트를 인쇄 할 때 프로그램이 있습니다.

$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".

STDOUT이로 평가되는 것처럼 쉘 스크립트 내에서 이것을 실행하고 싶습니다 source.

나는 다음과 같은 일을하고 싶습니다 ...

source `./settings`

... 물론 작동하지 않습니다.

나는 내가 할 수 있다는 것을 안다.

./settings >/tmp/file
source /tmp/file

그러나 나는 정말로 그것을하고 싶지 않습니다.

단서가 있습니까?

답변:


16

당신은 사용할 수 있습니다 eval:

eval "$(./settings)"

eval "`./settings`"

죄송합니다. bash가 아닌 / bin / sh입니다. $ ()가 작동하지 않습니다. 질문을 업데이트했습니다.
Majenko

@Matt : sh는 대부분의 시스템에서 bash입니다. 물론 최신 Ubuntu 버전을 의미하지 않는 한 대시로 대체되었습니다.
Hello71

@Matt :이 경우 백틱이 작동합니다. 그러나 당신은 정확한 버전을 추가해야합니다 sh-대시, 애쉬, busybox에 대한 심볼릭 링크 일 수 있습니다 ... 나는 "진짜 'sh'"의 사본을 보지 못했습니다.
user1686

1
@ 매트 : 그래서 당신은 ... 흥미로운 시스템을 가지고있다. 특히 4.3BSD$( ) 에서 Almquist의 쉘로 시작하는 거의 모든 "sh"변형이 지원 되기 때문에 POSIX도 마찬가지입니다. (참고 : 말다툼이 아닌 호기심)
user1686

$ ()는 존재하지만이 상황에서는 그렇게 작동하지 않습니다. FreeBSD 8.2의 / bin / sh
Majenko

15

/dev/fd사용 가능한 시스템에서 bash는 프로세스 대체를 지원합니다.

source <(./settings)

여기 에서 출력을 읽을 수 <( )있는 자동 할당 경로로 확장됩니다 ./dev/fd/..../settings


1
bash 매뉴얼에서는이를 "프로세스 대체"라고합니다.
glenn jackman

6
declare `./settings`

아니면 물론 ...

export `./settings`

물론 테스트하십시오 ...

export `echo -e "asdf=test\nqwerty=dvorak"` ; echo $asdf $qwerty

공백 처리 :

eval export `./settings`

아하, export트릭이 작동합니다! 감사합니다
Majenko

이제 값으로 공백을 어떻게 처리 할 수 ​​있습니까?
Majenko

@ 매트 : 의견에 백틱을 사용할 수 없으므로 수정 된 답변을 참조하십시오.
user1686

@grawity : 그렇습니다 당신은 할 수있다…a backtick --> ` <-- and here's another one --> ` <--
Hello71

2

source /dev/stdin < ./settings

나는 / dev / stdin이 리눅스 만의 것이라고 생각한다.


설정 내용을 소스하려고합니다. './settings'로도 './settings'로 실패 : 모호함 ( '= backtick)
Majenko

/dev/stdinBSD와 Cygwin에서도 작동합니다.
user1686

1
사용 |하지만,되어 있지 파이프의 양쪽 그래서 소스 명령은 현재 쉘에 영향을주지 않습니다, 별도의 하위 프로세스이기 때문에, (적어도 정확히) 작업에 가고.
user1686

1
그것을 반영하기 위해 편집했습니다.
LawrenceC

1
나는이 /dev/stdin트릭을 좋아 하지만 당신의 대답은 실제로 source ./settings그것을 실행하지 않고 평원과 같습니다 . 이것을 극복하기 위해 here-document를 사용할 수 있습니다 source /dev/stdin <<EOF \n $(./settings) \n EOF.
tlwhitec

0

다른 답변이 파일을 만들고 stdin에서 직접 가져 오지 않기 때문에 여기에 다른 관점을 제공하고 싶었습니다. 준비된 환경 정보를 여러 스크립트로 보내야하는 빌드가 있습니다. 내가하고있는 일은 문자열에 Bash 호환 변수 할당을 준비하는 것입니다.

Var1="Foo"
Var2="Bar"
Var3="Baz"

스크립트 실행을 준비 할 때 위의 여러 줄 문자열을 base64로 인코딩하여 셸 스크립트로 파이프합니다.

echo base64EncodedParameters | build.sh

build.sh에서 stdin, base64 디코딩 및 결과 평가를 읽었습니다.

params=""
while read line; do params="${params}${line}"; done
eval `echo $params | base64 -D`

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