Bash에서 명령 출력을 명령으로 가져 오려면 어떻게해야합니까?


8

체계

Linux hosek 4.15.0-48-generic #51-Ubuntu SMP Wed Apr 3 08:28:49 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

발행물

변수를 저장하려면 bash 스크립트에서 명령으로 출력을 가져와야합니다.

sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d'

이 명령은 다음 줄을 반환합니다.

email_sender='some@email.com'
email_recipients='another@email.com'

스크립트에서 이러한 출력 / 라인을 명령으로 읽고 실행하려면 어떻게해야합니까? 이 출력을 파일에 저장 한 다음 source명령으로 만 읽을 수 있습니까?

나는 | source명령의 끝에 시도했지만 파일에서만 읽습니다.

처음에 시도했지만 echo효과가 없었습니다.

감사.

답변:


15

으로 pLumo 당신을 보여 , 당신은 참으로 할 수있는 source그들. 그러나 나는 이것을 반대하는 것이 좋습니다. 이와 같은 것이 있다면 :

source <(sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d')

echo "$email_sender"

그런 다음 1 년 후 다시이 스크립트를 살펴보면이 email_sender변수의 출처를 알 수 없습니다 . 대신 명령을 변경하고 변수 값만 반환하고 이름은 반환하지 않는 명령을 사용하는 것이 좋습니다. 이렇게하면 각 변수의 출처를 쉽게 추적 할 수 있습니다.

email_sender=$(grep -oP 'email_sender=\K.*' webcheck-$category.cfg)
email_recipients=$(grep -oP 'email_recipients=\K.*' webcheck-$category.cfg)

나는 이것이 더 낫다는 것에 동의한다 ;-) 적어도 당신이 나중에 사용하고자하는 스크립트의 경우.
pLumo

둘 다 감사합니다! 좋고 간단합니다. ;)
genderbee

2의 경우 이것은 괜찮습니다. 더 간접적으로 루프에 사용합니다 : for var in email_sender email_recipient email_subject email_attachement etc ; do printf -v "${var}" '%s' "$(grep -oP $var'=\K.*' webcheck-$category.cfg)"; done그러나 이것은 "간단한"기준에 실패합니다.
법 29


0
#!/bin/bash

declare -A data
while IFS='=' read -r key value; do
    data[$key]=${value//\'/}
done < <(grep -E '^([^#].+=.*)' webcheck-$category.cfg)

또는

done < <(sed -n '/# Main configuration./,/# Websites./{//!p}' webcheck-$category.cfg)
# associative array.
echo ${data[email_sender]}
echo ${data[email_recipients]}

산출:

some@email.com another@email.com


-1

bash read 내장은 이와 같은 것들을 잘 처리합니다.

read -d '' -r email_sender email_recipients < <(
  grep -oP 'email_sender=\K.*' webcheck-$category.cfg; 
  grep -oP 'email_recipients=\K.*' webcheck-$category.cfg
)

readstdin에서 변수로 행을 읽습니다. -d ''개행을 제외하고 공백 분할을 해제합니다. 이스케이프를 -r비활성화합니다 \.

cmdA < <(cmdB)cmdB와 유사하게 작동 | 이전의 cmdA를 제외하고 cmdA는 서브 쉘 대신 ~ this ~ 쉘에서 실행되며, 읽기가 예상대로 작동하는 데 필요합니다.


1
라인의 다른 부분에 대한 설명이 있습니까?
Simon Sudler

이것은 사실이지만, 파일에서 목표를 어디에서 읽어야하는지 묻는 질문과 어떻게 관련이 var=value있습니까?
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.