터미널에서 다음 명령을 실행하는 것의 차이점은 무엇입니까?
명령 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
끝에 "&"가 있으면 명령이 백그라운드에서 실행됩니다. 이에 대한 전체 설명을 보려면 이 링크를 확인하세요.