루프 내에서 프로그램을 실행하고 종료 값을 확인하는 쉘 스크립트

루프 내에서 프로그램을 실행하고 종료 값을 확인하는 쉘 스크립트

쉘 스크립트에서 이를 수행하는 방법:

for (int i=0;i<1000;i++) {

   run applicationA
   run applicationB
   if (retvalFromApplicationB!=0) {continue;}
   else {pipe ouptut (stdout) from applicationB to (stdin of) (and start) applicationC}
   if (retvalFromApplicationC!=0) {break;}
}

우분투를 실행 중입니다

답변1

#! /bin/sh -
i=0; while [ "$i" -lt 1000 ]; do
  cmdA
  cmdB > tempfile || continue
  cmdC < tempfile || break
  i=$((i + 1))
done
rm -f tempfile

현재 디렉토리를 임시 파일로 가득 채울 수 없다면 다음과 같이 하십시오:

#! /bin/sh -
i=0; while [ "$i" -lt 1000 ]; do
  cmdA 3>&- 4<&-
  tmp=$(mktemp) || exit
  exec 3> "$tmp" 4< "$tmp"
  rm -f "$tmp"
  cmdB >&3 3>&- 4<&- || continue
  cmdC <&4 3>&- 4<&- < tempfile || break
  i=$((i + 1))
done
exec 3>&- 4<&-
rm -f tempfile

cmdB무엇을 하든 해당 출력이 종료될 때까지 종료 상태를 얻을 수 없으므로 해당 출력을 어딘가에 저장해야 합니다.

메모리에 저장할 수 있습니다. cmdB출력이 텍스트 인 경우 다음을 수행할 수 있습니다.

#! /bin/sh -
i=0; while [ "$i" -lt 1000 ]; do
  cmdA
  output=$(cmdB > tempfile && echo .) || continue
  output=${output%.}
  printf %s "$output" | cmdC || break
  i=$((i + 1))
done

printf내장되어 있지 않은 경우 /bin/sh(예: 설치했거나 만든 mksh경우 ) 출력이 128KiB보다 크면 실패합니다.yashsh

또는 다음을 사용할 수 있습니다 perl.

#! /usr/bin/perl
for ($i = 0; $i < 1000; $i++) {
  system "cmdA";
  $output = `cmdB`;
  next if $?;
  open TO_C, "|-", "cmdC" or last;
  print TO_C $output;
  close TO_C;
  last if $?;
}

답변2

쉘이 bash라면 $?도 작동한다고 덧붙이고 싶습니다. 매뉴얼 페이지에서: "가장 최근에 실행된 포그라운드 파이프의 상태로 확장합니다." 이는 마지막으로 실행된 프로세스의 종료 상태를 저장한다는 의미입니다.

    #!/bin/bash
    for (int i=0;i<1000;i++) 
    {
       run applicationA
       retvalFromApplicationA = $?

       run applicationB
       retvalFromApplicationB = $?

       if (retvalFromApplicationB!=0) {continue;}
       else {pipe ouptut (stdout) from applicationB to (stdin of) (and start) applicationC}
       if (retvalFromApplicationC!=0) {break;}
    }

위의 코드는 applicationC의 종료 상태를 캡처하지 않지만 다음과 같습니다.

applicationB | applicationC
if [ $? -eq 0 ]; then ...

종료할 마지막 프로세스가 applicationC이기 때문에 이는 작동합니다. 다른 쉘을 사용하는 경우 man/info 페이지를 확인하십시오. && 및 || 연산자를 사용하여 이를 수행하는 다른 방법도 있습니다.

관련 정보