파일이 있으면
cmd1
cmd2
cmd3
나는 그것들을 서로 독립적으로 실행하고 종료 상태를 출력하는지 독립적으로 실행하고 싶습니다. 즉, 종료될 것으로 예상하지 않고 프로세스를 계속 시작하면 실패할 수도 있고 실패할 수도 있습니다. 이것이 ;
다음 명령을 실행한다는 것을 알고 있지만 이전 명령이 실패하거나 성공할 때까지 기다리기 때문에 이는 사실입니다.
; 그런 sleep 60m
다음 음악을 재생하고 벨을 울리고 브라우저를 실행하지만 분명히 음악이 재생되고 벨이 울리고 브라우저가 실행될 때까지 기다릴 방법이 없습니다. 그것은 즉시 일어나야 합니다.
추가됨: 예를 들어, 어떻게
파일에서 줄을 읽고, 각 줄에 대해 터미널을 열고 실행하시겠습니까?
답변1
모든 명령을 백그라운드로 분기하려면 각 줄 끝에 & 기호를 추가하기만 하면 됩니다.
cmd1 &
cmd2 &
cmd3 &
예
$ more at_once.bash
#!/bin/bash
echo "1" && sleep 10 &
echo "2" && sleep 10 &
echo "3" && sleep 10 &
pgrep -a sleep
이제 이 스크립트를 실행하면 다음과 같습니다.
$ ./at_once.bash
1
3
2
7533 sleep 10
7535 sleep 10
7536 sleep 10
두 번째 명령 이전에 세 번째 명령이 에코되어 배경 특성으로 인해 작업이 순서대로 실행되지 않는 것을 볼 수도 있습니다. pgrep sleep
동시에 실행되는 3가지 백그라운드 명령을 모두 표시합니다 .
노트:echo "X" && sleep 10
이 기호는 명령이 백그라운드에서 실행 중임을 나타내기 위해 사용됩니다 . 이 표기법은 백엔드 자체와는 아무런 관련이 없으며, 후행은 &
명령을 sleep 10
백엔드에 "넣는" 것입니다.
&
단일 명령줄에서 이 작업을 수행하려는 경우 구분 기호로 사용할 수도 있습니다.
$ sleep 10 & sleep 10 & sleep 10 &
[1] 7731
[2] 7732
[3] 7733
이 라이너를 확인해 보세요:
$ pgrep -a sleep
7731 sleep 10
7732 sleep 10
7733 sleep 10
다시 한번 우리는 그것들이 모두 동시에 실행되는 것을 봅니다. 세미콜론을 사용하려는 경우:
$ sleep 10 ; sleep 10 ; sleep 10
이러한 sleep 10
명령은 직렬로 실행되는 경우 완료하는 데 30초가 걸리고 병렬로 실행되는 경우 10초만 소요됩니다.