리눅스에서 명령 사용을 기다 립니까?


16
#!/bin/bash
function back()
{
    sleep $1
    exit $2
}
back $1 $2 &
b=$!
if `wait $!`;then
    echo success
else
    echo failure
fi
bash-3.00# ./back 300 0
failure
bash-3.00# ./back 300 1
failure

success0을 보낼 때 종료 상태 로 예상 되었지만 여전히을 받고 failure있습니다.

또한 wait300 초 동안 기다리지 않습니다. 대신 즉시 메시지가 나타납니다. 나는 나의 대본에서 $!직계의 자식 이라고 가정한다 $$. 그렇지 않습니까?

대기의 종료 상태를 다음과 같이 캡처 할 수 exit_status=$(wait $!)있습니까?

if ! ((exit_status));then
    echo sucess
else
    failure
fi

답변:


20

문제는 wait하위 쉘에서 발행한다는 것입니다 .

if `wait $!`;then

wait명령이 아니라 내장되어 있기 때문에 현재 쉘이 아닌 서브 쉘 에서 작동합니다 .

당신이 볼 수 있지만 그렇지 않은 결과는 다음과 같습니다.

wait: pid 12344 is not a child of this shell

... 반환 상태가 1입니다.

테스트를 수행하려면 서브 쉘을 사용하지 않고 테스트를 수행해야합니다.

#!/bin/bash
function back()
{
  sleep $1
  exit $2
}
back $1 $2 &
b=$!

wait $b && echo success || echo failure

이렇게하면 예상 한 결과가 나오고 기대하는 한 기다립니다.

$ time ./test.sh 3 0
success
./test.sh 3 0  0.00s user 0.01s system 0% cpu 3.012 total
$ time ./test.sh 3 1
failure
./test.sh 3 1  0.00s user 0.01s system 0% cpu 3.012 total

다음을 사용하여 모든 명령의 종료 상태를 확인할 수 있습니다 $?.

$ /bin/true
$ echo $?
0
$ /bin/false
$ echo $?
1

스크립트에 다른 오류가 몇 개있었습니다. 귀하의 #!라인은 내가 고정하는, 부정했다. 당신은 지정 $!$b있지만 사용하지 마십시오 $b.


12

백틱을 제거하십시오.

마찬가지로, wait상위 쉘의 작업에 액세스 할 수없는 서브 쉘에서 실행 중이므로 즉시 실패합니다.


종료 상태를 원하면 $?대기 직후 의 값을 얻으십시오 .

command_here &
wait
status=$?

2

백틱을 제거하면 프로그램이 작동하지만 이미 확인 된 이유로 완전히 작동하지는 않습니다. wait서브 쉘에서 실행되고 상위 프로세스에 액세스 할 수 없기 때문에 즉시 실패 하는 것은 사실 이지만, 작동 한 명령을 사용하더라도 프로그램이 예상대로 실행되지 않습니다.

if종료 상태가 제로 또는 제로가 아닌 경우 문은 프로그램 검사를 실행합니다. 백틱을 사용하는 경우 if 문은 프로세스 의 출력 을 가져 와서 프로그램으로 실행 한 다음 해당 프로세스의 종료 코드를 사용합니다. 따라서 프로그램은 실패로 인해 wait실패 wait하지 않고 출력을 생성하지 않으므로 실패합니다 .

echo백틱 내부 를 사용하여 스크립트를 작동시킬 수 있습니다 .

if `echo wait $!`; then
    echo success
else
    echo failure
fi

또는 백틱을 제거하십시오. 모두에게 더 쉽습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.