bash에서 백그라운드에서 프로세스를 실행하는 것은 매우 쉽습니다.
$ echo "Hello I'm a background task" &
[1] 2076
Hello I'm a background task
[1]+ Done echo "Hello I'm a background task"
그러나 출력은 장황합니다. 첫 번째 줄에는 백그라운드 작업의 작업 ID와 프로세스 ID가 인쇄되고 명령의 출력이 표시되고 마지막으로 작업 ID, 작업 상태 및 작업을 트리거 한 명령이 표시됩니다.
마지막에 앰퍼샌드없이 출력이 정확히 표시되도록 백그라운드 작업 실행의 출력을 억제하는 방법이 있습니까? 즉 :
$ echo "Hello I'm a background task" &
Hello I'm a background task
내가 묻는 이유는 탭 완성 명령의 일부로 백그라운드 프로세스를 실행하여 해당 명령의 출력이 의미를 갖도록 중단되지 않아야하기 때문입니다.
답변
완료와는 관련이 없지만 하위 쉘에 호출을 넣어 출력을 억제 할 수 있습니다.
(echo "Hello I'm a background task" &)
답변
@shellter의 답변을 바탕으로 이것은 나를 위해 일했습니다.
tyler@Tyler-Linux:~$ { echo "Hello I'm a background task" & disown; } 2>/dev/null; sleep .1;
Hello I'm a background task
tyler@Tyler-Linux:~$
나는 그 이유를 모르지만 bash가 프로세스 ID를 출력하는 것을 방지하는 오래된 게시물에서 기억했습니다.
답변
일부 최신 버전의 bash 및 ksh93에서는 하위 쉘 또는 프로세스 그룹 (예 :)으로 묶을 수 있습니다 { ... }
.
/home/shellter $ { echo "Hello I'm a background task" & } 2>/dev/null
Hello I'm a background task
/home/shellter $
답변
위의 답변을 바탕으로 명령에서 stderr을 허용해야하는 경우 :
f() { echo "Hello I'm a background task" >&2; }
{ f 2>&3 &} 3>&2 2>/dev/null
답변
이 답변을 바탕으로 더 간결하고 정확한 것을 생각해 냈습니다.
silent_background() {
{ 2>&3 "$@"& } 3>&2 2>/dev/null
disown &>/dev/null # Prevent whine if job has already completed
}
silent_background date
답변
시험:
user@host:~$ read < <( echo "Hello I'm a background task" & echo $! )
user@host:~$ echo $REPLY
28677
그리고 출력 과 PID를 모두 숨겼습니다 . $ REPLY에서 여전히 PID 를 검색 할 수 있습니다.
답변
이전 게시물에 대한 답변에 대해 죄송하지만 다른 사람에게 유용하다고 생각하며 Google의 첫 번째 답변입니다.
이 방법 (서브 쉘)에 문제가 있고 ‘대기’를 사용하고있었습니다. 그러나 함수 내에서 실행하면서 다음과 같이 할 수있었습니다.
function a {
echo "I'm background task $1"
sleep 5
}
function b {
for i in {1..10}; do
a $i &
done
wait
} 2>/dev/null
그리고 내가 그것을 실행할 때 :
$ b
I'm background task 1
I'm background task 3
I'm background task 2
I'm background task 4
I'm background task 6
I'm background task 7
I'm background task 5
I'm background task 9
I'm background task 8
I'm background task 10
프롬프트를 다시 받기까지 5 초의 지연이 있습니다.