2016-09-29 4 views
2

bash에서는 프로그램 (gollum)을 시작하고 stderr (포트 번호)의 일부를 다른 프로그램의 인수로 사용하려고합니다. stderr을 stdout으로 리디렉션하고 grep 및 sed를 사용하여 출력을 필터링합니다. 나는 표준 출력에 결과를 얻을 : 그것은 '56343'를 반환하고 골룸은 서버와 같이 계속 실행장기 실행 프로세스에서 영향을주지 않는 xargs로 파이핑

gollum -p0 2>&1| sed -n -e "s/.*port=//p" 

.

그러나 이것을 xargs와 함께 다른 프로그램 (예 : 에코이지만 나중에 포트 번호가있는 인터넷 탐색기를 실행하는 데 사용하려는 경우)의 인수로 사용하려면 작동하지 않습니다.

gollum -p0 2>&1| sed -n -e "s/.*port=//p" | xargs -n1 echo 

아무런 일도 일어나지 않습니다. 그 이유를 아십니까? 아니면 똑같은 일을 할 생각이 다른가요?

도움 주셔서 감사합니다.

+1

배쉬는 파이프 라인의 모든 아이들이 죽을 때까지 기다리고, '골룸'은 죽지 않는다 (원 링이 그를 계속 살아 가게한다)? –

+0

실제로는 골룸이 죽지 않기 때문입니다. 나는 다른 곳에서 죽이고 그것은 작동한다. 포트 번호가 반환 되 자마자 두 번째 프로그램을 어떻게 작동시킬 수 있습니까? –

+1

'gollum'에 'daemon'모드로 실행하는 옵션이 없다면'(gollum -p0 2> & 1 &) | sed ... | xargs ... '를 사용해야한다고 가정합니다. '(...) '의 서브 쉘은'gollum'이 죽을 때까지 기다리지 않습니다. 당신은 여전히'sed'로 죽지 않는 문제가있을 수 있습니다. 어쩌면'sed -n -e '/ port =/{s /.* port = //; p; q;}''를 사용하여 첫 번째 포트 라인 다음에서 멈출 수 있습니다. 두 가지 하위 팀이 필요하다고 생각합니다. 죽을 때 '골룸'을 실행하는 과정과 죽을 출력을 분석하는 'sed'가 필요합니다. –

답변

2

서버를 백그라운드에서 계속 실행하지 않으려면이 작업을 수행하는 것이 좋습니다. 당신이 핸들러에서 루프에서 다음 port=, break를 포함에만 라인을 읽으려면 ...

#!/bin/bash 
#  ^^^^- not /bin/sh; needed for >(...) syntax 

gollum -p0 > >(
    while IFS= read -r line; do 
    # start a web browser here, etc. 
    [[ $line = *"port="* ]] && echo "${line##*port=}" 
    # ...for instance, could also be: 
    # open "http://localhost:${line##*port=}/" 
    done 
) 2>&1 & 

, 나머지를 처리 ​​: 당신이 할 경우, 하나의 접근 방식은 공정 대체를 사용하는 것입니다 종료하기 전에 표준 입력 (이것은 cat >/dev/null을 사용하는 것만 큼 쉽습니다).

+0

고마워요, 아마 작동하지만 좀 더 단순한 것을 기대하고있었습니다. –

+2

읽기 쉬운 측면에서 "단순"과 매우 잘 정의 된 동작을하는 측면에서 "단순"의 차이가 있습니다. 종종 bash에서 하나의 단순함 또는 다른 단순함을 가질 수 있지만 둘 다를 가질 수는 없습니다. –