쉘 스크립트에서 이를 수행하는 방법:
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보다 크면 실패합니다.yash
sh
또는 다음을 사용할 수 있습니다 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 페이지를 확인하십시오. && 및 || 연산자를 사용하여 이를 수행하는 다른 방법도 있습니다.