grep 결과에서 나오는 줄을 실행하는 방법?


10

특정 설치 지침이 포함 된 텍스트 파일이 있으며 파일에서 고유 한 항목을 grep 할 수 있다는 것을 알고 있습니다. 예를 들어, 텍스트 파일은 다음과 같습니다.

MYDIR =`찾기 / home / user-이름 somedir`
수출 PERL5LIB = $ PERL5LIB : $ MYDIR

bash에서 파일에서 grep 후 행을 어떻게 실행할 수 있습니까? 다음과 같은 것 :

"grep somedir INSTALLFILE"의 결과 실행
"grep 'export PERL5LIB'INSTALLFILE"의 결과 실행

2
이 방식으로 자동 실행하는 것이 조금 위험하지 않습니까?
Faheem Mitha 2016 년

2
@Faheem and @avilella : 십대 이상, 오히려 위험합니다! 또한 약간 깨지기 쉽습니다.
Caleb

답변:


4

가정 :

  • 이 파일을 제어 할 수 있으며 악성 코드의 위험이 없습니다
  • 이 변수를 현재 쉘로 설정하려고합니다

명령을 임시 파일로 리디렉션하고 다음을 실행할 수 있습니다.

tmp=$(mktemp)
{
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
} > "$tmp"
. "$tmp"

또는 결과를 평가할 수 있습니다

eval "$(grep somedir INSTALLFILE)"
eval "$(grep 'export PERL5LIB' INSTALLFILE)"

오래된 답변을 업데이트합니다. 내가 오늘 할 일은 프로세스 대체를 사용하는 것입니다.

source <(
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
)

source <(...)경우 bash 4 이상이 필요합니다. 이전 버전에서는 작동하지 않았습니다 (zsh는 괜찮 았습니다).
Stéphane Chazelas

11

별도의 쉘 프로세스에서 행을 평가하려면 다음을 수행하십시오.

grep somedir INSTALLFILE | sh

실행중인 쉘 프로세스에서 행을 평가하려면 다음을 수행하십시오.

eval "$(grep somedir INSTALLFILE)"

나무를 통해 숲을 볼 수있는 유일한 사람은 +1입니다. 이로써 내 답변을 삭제합니다. @avilella : 편의를 위해 당신은 사용할 수 있습니다 -A 1또는 -B 1하나에 플래그 또는 다른로 grep의 그 @Gilles 솔루션 중 하나 그렙 및 사용에 두 줄을 가져.
Caleb

일부 시스템 sh에서는 예상 한 것 대신 다른 쉘에 대한 심볼릭 링크 일 수 있으므로 결과를 예측할 수 없습니다. 안전을 위해, 당신이 기대하는 정확한 껍질을 구체적으로 명시하십시오.grep somedir INSTALLFILE | bash
thdoan

-2

다음과 같이 find의 'exec'기능 사용을 고려 했습니까?

find somedir -name INSTALLFILE -exec {}\;

OP가 찾기에서 나오는 모든 결과를 실행하는 것이 아니라 grom grep으로 돌아 오는 결과를 실행하려고한다고 생각합니다.
Caleb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.