2013-06-01 1 views
8

요약 : 나는 백그라운드에서 프로세스를 실행하는 bash 스크립트를 가지고 있으며 일반적인 명령과 명령 대체 블록 내에서 작동해야합니다. $(...). 스크립트 자체는 백그라운드로 포크하는 프로세스를 생성합니다.

#!/bin/sh 
echo something 
sleep 5 & 

쉘에서이 스크립트를 실행하면 즉시 반환합니다 (인쇄 "뭔가") $(...) 내부에 그것을 실행은 백그라운드로 "잠"을 기다리고, 5 초 동안 중단됩니다 :이 테스트 케이스로 줄일 수있다 끝내기 위해.

명령 대체 쉘에서 시작되어 백그라운드에서 프로세스를 생성하는 모든 항목에 적용됩니다. 프로세스 트리에있는 모든 하위 항목을 포함하여 분명히 나타납니다. bash와 zsh에 모두 영향을 미쳤고 다른 것을 시도하지 않았습니다.


원래 질문 : 나는 그것이 실행될 때마다 표준 출력에 값을 인쇄하기로하고 또한이 X 클립 보드에 복사 된 bash는 스크립트가 있습니다.

$ something 
something 
$ xclip -o -selection clipboard 
something 
$ echo $(something) 
^C 
:

#!/bin/sh 
echo something 
echo something | xclip -selection clipboard 

이 스크립트 (의 그것을 호출 "뭔가"를하게하는) (실제로는 다른 명령의 출력)이 단어를 얻기 위해 사용하고 다음과 같은 여러 가지 방법으로 사용할 수 의미

일반 stdout으로 출력하고 일반 X 응용 프로그램에서 사용하기 위해 출력을 클립 보드에 복사하며 명령의 중간에이 단어를 삽입하기 위해 bash 명령 대체와 함께 stdout을 사용할 수도 있어야합니다.

그러나 bash 명령 대체는 xclip이 전경에서 계속 살아있는 것으로 보입니다. xclip은 일반적으로 X 클립 보드가 클라이언트가 클립 보드 내용을 제공해야하므로 기본 동작은 클립 보드 내용이 대체되면 종료되도록하는 것입니다. 이

이 사람이 행동을 설명 할 수있는 $(...) 쉘 내부 daemonizes 그 어떤 것도 적용하는 것, 그래서 내가이 질문의 시작 부분에 쓴 최소한의 테스트 케이스를 만들어 XCLIP이 문제가 발생 후

? 내가 그것을 피할 수있는 방법이 있습니까?

답변

12

백그라운드 프로세스가 명령 대체를 방해하지 않도록하려면 stdout 연결을 끊어야합니다.

$ cat bg.sh 
#!/bin/sh 
echo before 
sleep 5 >/dev/null & 
echo after 
$ date; x=$(./bg.sh); date; echo "$x" 
Sat Jun 1 13:02:26 EDT 2013 
Sat Jun 1 13:02:26 EDT 2013 
before 
after 

당신은 백그라운드로 프로세스의 표준 출력을 캡처 할 수있는 기능을 잃게됩니다,하지만 당신은 배경에서 실행하는 경우 당신은 아마 걱정하지 않는다 : 이것은 즉시 반환됩니다. bg.sh 프로세스는 항상 디스크에 쓸 수 있습니다.

+0

우! 완벽하고 매우 간단한 솔루션입니다. 감사! – dequis

+0

그런데/dev/null 대신 파일로 리디렉션하면 출력물을 캡처하는 것처럼 보이지만 적어도 여기서 출력 파일은 백그라운드 프로세스가 종료 된 후에 만 ​​업데이트됩니다. (나는 이것을 위해 필요로하지 않는다) – dequis