하나의 명령 줄에 &가있는 여러 명령을 어떻게 실행할 수 있습니까?


12

두통 문제가 발생했습니다.

백그라운드에서 여러 명령을 실행하고 싶기 때문에 bash에서 하나씩 시작하고 싶습니다. 다음과 같이 Linux 쉘에서 하나의 명령을 백그라운드에서 쉽게 시작할 수 있습니다.

myCommand &

다음과 같이 여러 명령을 쉽게 시작할 수도 있습니다.

myCommand1 && myCommand2

또는

myCommand1 ; myCommand2

그러나 백그라운드에서 여러 명령을 실행하려면 다음 명령 형식을 시도했지만 실패했습니다.

myCommand1 & && myCommand2 &

또는

myCommand1 & ; myCommand2 &

두 형식 모두 실패합니다. &하나의 명령 줄에 있는 여러 명령을 어떻게 실행할 수 있습니까?


2
그것들을 스크립트에 넣고 백그라운드에서 스크립트를 실행하십시오
Panther



Panther에서는 ()를 사용하면 스크립트를 사용하는 것보다이 문제를 훨씬 쉽게 해결할 수 있습니다. 우리가 원하는 것을 작성하는 대신 먼저 쉘 자체에서 제공하는 기능을 최대한 활용 해 봅시다. 물론 스크립트를 사용하면이 문제를 해결할 수도 있습니다. 어쨌든 고마워
Clock ZHONG

'tail -F <file1>> <file2>'다음에 'jobs -l'을 실행하고 다시 'disown -h % 1'을 실행하려면 어떻게해야합니까?
akskap

답변:


24

사용하다 ().

순차적으로 실행하려면 다음을 수행하십시오.

(myCommand1; myCommand2) &

또는

(myCommand1 &) && (myCommand2 &)

그것들을 병렬로 실행하려면 :

myCommand1 & myCommand2 &

bash에서 이것을 사용할 수도 있습니다 ({및; 뒤에 공백은 필수입니다).

{ myCommand1 && myCommand2; } &

3
(myCommand1 &) && (myCommand2 &)실패 myCommand2하더라도 실행 됩니다 myCommand1.
terdon

()는 bash가 &와 &&를 구별하는 데 도움이 될 수 있습니다. 따라서 & 및 && togather를 사용하려는 경우 ()를 사용하여 실행 단위를 분리하십시오.
Clock ZHONG

16

나는 당신이 이것을 원한다고 가정합니다 :

myCommand1 & myCommand2 &

myCommand1앰퍼샌드가 뒤 따르는 것으로 시작 하여 백그라운드로 보낸 다음 즉시 시작 myCommand2하여 백그라운드로 보내므로 셸이 다시 해제됩니다.

기울기

이해를 돕기 위해 여기 에서 명령으로 파이프 라인 을 대체 할 수 있습니다.

목록은 운영자 중 하나에 의해 분리 된 하나 이상의 파이프 라인 시퀀스입니다 . , & , && 또는 || , 및 선택적으로 ; , & 또는 .

제어 연산자 & 가 명령을 종료 하면 쉘은 백그라운드에서 서브 쉘의 명령을 실행합니다. 쉘은 명령이 완료되기를 기다리지 않고 리턴 상태는 0입니다. 명령은 ;로 구분됩니다 . 순차적으로 실행됩니다. 쉘은 각 명령이 차례로 종료 될 때까지 기다립니다. 리턴 상태는 마지막으로 실행 된 명령의 종료 상태입니다.

AND 및 OR 목록은 &&||로 구분 된 하나 이상의 파이프 라인 시퀀스입니다. 각각 제어 연산자.
출처:man bash

이를 예제로 나누겠습니다. 명령을 결합하고 다음 중 하나로 분리하여 목록을 작성할 수 있습니다. ; & && ||:

command1 ; command2  # runs sequentially
command1 && command2 # runs sequentially, runs command2 only if command1 succeeds
command1 || command2 # runs sequentially, runs command2 only if command1 fails
command1 & command2  # runs simultaneously

다음 중 하나를 사용하여 목록을 종료 할 수 있습니다 ; & <newline>..
일반적으로 당신은 눌러 명령이나 목록을 실행 Enter같음을, 그 <newline>. 세미콜론 ;은 특히 ​​스크립트에서 동일한 목적으로 사용됩니다. &그러나 앰퍼샌드 는 백그라운드에서 서브 쉘에서 명령을 시작하여 쉘을 즉시 해제합니다.

()둥근 대괄호 {}를 사용 하여 목록을 추가로 그룹화 할 수 있습니다 . 차이점은 둥근 대괄호는 서브 쉘을 생성하지만 중괄호는 그렇지 않습니다. 중괄호는 첫 번째와 세미콜론 뒤에 공백이 있어야하며 닫는 괄호 앞에 줄 바꿈이 있어야합니다. 예를 들면 다음과 같습니다.

# if c1 succeeds start a shell in the background
# and run c2 and c3 sequentially inside it
c1 && ( c2 ; c3 ) & 
# run c1 and if it succeeds c2 sequentially as a group command
# if c1 or c2 fail run c3 in the background
{ c1 && c2 ;} || c3 &

확실하지 않은 용도로 사용 true하고 false건설이 예상대로 작동하는지 테스트하는 경우 상당히 복잡해질 수 있습니다 .

$ { true && true ;} || echo 2
$ { true && false ;} || echo 2
2

작업 제어

jobs명령은 현재 쉘에서 실행 중이거나 최근에 완료된 백그라운드 작업 목록을 표시합니다. 작업 제어를위한 여러 가지 단축키와 명령이 있습니다.

  • Ctrl+ 현재 포 그라운드에서 실행중인 프로세스 Z중지 되도록 하는 일시 중단 문자를 입력합니다. 종료되지는 않지만 jobs목록에 남아 있습니다.
  • Ctrl+ 터미널에서 입력을 읽으려고 할 때 포 그라운드에서 현재 실행중인 프로세스가 중지되도록Y 하는 지연된 일시 중단 문자 유형
  • fg= %필요한 경우 프로세스를 포 그라운드로 가져와 다음과 같이 프로세스를 지정할 수 있습니다.

     %       # last process in the jobs list
     %1      # 1st process in the jobs list
     %abc    # process beginning with the string “abc”
     %?abc   # process containing the string “abc” anywhere
    
  • bg= %&필요한 경우 백그라운드에서 프로세스를 시작합니다.

     %&      # last process in the jobs list
     %1&     # 1st process in the jobs list
     %abc&   # process beginning with the string “abc”
     %?abc&  # process containing the string “abc” anywhere
    
  • wait 백그라운드 프로세스가 완료 될 때까지 대기하고 종료 상태를 반환합니다.

     wait %1 # 1st process in the jobs list

    시간이 오래 걸리는 프로세스 ( jobs번호 3)를 시작한 다음 컴퓨터가 끝났을 때 컴퓨터를 일시 중단 echo하고 프로세스가 성공하지 못한 경우 메시지를 표시 한다고 상상해보십시오 .

     wait %3 || echo failed ; systemctl suspend

그러나 &&주의 해야하는 것은 명령이 리턴 하는 것에 의존 하므로, 우리가 호출하는 것이 실제로 bash가 진실한 가치로 간주하는 것을 리턴하는지 확인해야합니다.
mathreadler

@mathreadler 잘못 작성된 사용자 스크립트에 대해 이야기하지 않는 한 종료 값은 매우 잘 정의되어 있으며 (참조 man bash) AFAIK의 의도대로 정확하게 사용됩니다. 이상한 것은 없었습니다.
디저트

정확하게, 잘못 작성된 사용자 스크립트에주의해야합니다. 그것들은 존재하며 그러한 버그를 찾기가 어려울 수 있습니다. Askubuntu에서는 "@ 디저트"를 허용하지 않습니다.
mathreadler

아, 알겠습니다. 이제 언급 했으니 말이됩니다.
mathreadler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.