쉘 스크립트에서 for 루프 뒤의 앰퍼샌드

쉘 스크립트에서 for 루프 뒤의 앰퍼샌드

터미널에서 다음 명령을 실행하는 것의 차이점은 무엇입니까?

명령 1

for i in {1..3}; do ./script.sh >& log.$i  & done

그리고

명령 2

for i in {1..3}; do ./script.sh >& log.$i  & done &

첫 번째 명령을 실행하면 화면에 세 개의 작업 ID가 표시되고 터미널에 다음 명령을 입력할 수 있습니다.

두 번째 명령은 조금 이상합니다. 화면에 작업 ID가 표시되지 않고 jobs명령을 실행한 후에도 볼 수 없습니다.일자리는 다 어디로 갔나요?

script.sh 내부에는 다음 루프가 있습니다.

for k in 1; do
 ./tmp -arguments
done

echo "hello"

명령 1을 사용하면 실행 파일이 실행 중이지만 아직 실행되지 않은 것으로 나타납니다 htop( ./tmp로그 echo "hello"파일에는 없음).

htop명령 2를 사용하면 실행 파일 ./tmp이 실행 중이고 실행되었음을 알 수 있습니다 echo "hello"(로그 파일에 표시됨).

&터미널의 명령이 쉘 스크립트 내의 for 루프 동작을 변경하는 이유는 무엇 입니까?

[GNU bash, 버전 4.3.11(1)-릴리스(x86_64-pc-linux-gnu)]

답변1

첫 번째

for i in {1..3}; do
    ./script.sh >& log.$i  &
done

현재 쉘에서 실행하십시오. 루프가 반복될 때마다 script.sh스크립트가 현재 셸에 대한 작업으로 실행되므로 그런 식으로 볼 수 있습니다.

두번째

for i in {1..3}; do
    ./script.sh >& log.$i  &
done &

먼저 루프를 제어하는 ​​서브셸을 시작합니다. 그런 다음 3번의 반복으로 3개의 하위 프로세스를 만듭니다.저것현재 셸에서는 아직 특정 작업으로 구분되지 않은 전체 명령인 1개의 작업만 표시됩니다. (이 1개의 직업을 보아야 합니다.달리기또는 다음과 같이완벽한.)

두 경우 모두 실행 파일은 ./tmp동일한 방식으로 실행되어야 합니다. echo "hello"실행된 것으로 표시되면 ./tmp이전에 완료되었음을 의미합니다. 이상하게 동작하는 경우 디버깅해야 합니다(그리고 질문에 세부 정보를 추가해야 합니다). 특히, 두 경우 모두 호출 시 시작 조건이 동일한지 확인하세요. 예를 들어. 기존 파일을 확인하는 경우 두 경우 모두 실제로 존재하는지, 존재하지 않는지 등을 확인하십시오.

답변2

끝에 "&"가 있으면 명령이 백그라운드에서 실행됩니다. 이에 대한 전체 설명을 보려면 이 링크를 확인하세요.

백그라운드에서 Bash 명령 실행

관련 정보