예를 들어 변수를 정의한다고 가정해 보겠습니다.
DROP=
루프가 있습니다.
# highly compatible, streaming,
# line-wise parser for embedded device
# no awk or external dependency
while IFS= read -r line; do
...
generate_output_1 | xargs echo
...
generate_output_2 | xargs echo
...
generate_output_N | xargs echo
done <<<$(cleanFile x.txt) > "$OUTPUT_STREAM"
출력 전달 기능을 어떻게 전환합니까? 함수 정의를 고려할 수 있지만 출력을 끄거나 켤 수 있는 명령이 있습니까?
# e.g.
DROP=-d
generate_output | spigot ${DROP}
이러한 의견을 해결하기 위해 질문을 하기 전에 if 문을 사용했습니다. 스트리밍 파서에 익숙한 분들은 가능하면 if 문을 피하는 것이 중요합니다. 왜냐하면 while 루프의 본문에 이미 if 문이 필요한 경우가 많기 때문입니다. 따라서 나는 제어 표현식(예: [ .. ] && ... || ...
)을 포함하여 if 문 솔루션을 피하기 위해 많은 노력을 기울일 것입니다.
둘째, 변수를 정의하려고 합니다 PIPE
.
if [ -z "$DROP" ]; then
PIPE=/dev/stdout
else
PIPE=/dev/null
fi
대신 추가 ... | xargs echo
하면 됩니다. 실제로 내 BASH 버전과 가상화된 환경의 while 루프에서는 작동하지 않습니다. 이는 내가 while 루프의 출력을 관리하기 위해 이 기술을 사용했기 때문입니다. 이 기술은 예제의 마지막 줄에서 이미 사용되었습니다. 에서는 OUTPUT_STREAM
매개변수 또는 기본값을 기반으로 파일을 교환합니다 /dev/stdout
.
done <<<$(cleanFile x.txt) > "$OUTPUT_STREAM"
내가 정말로 원하는 것은 작업을 수행하는 간결한 명령입니다 spigot
. 그게 다야.
답변1
아니요, 없습니다. 귀하의 요구 사항을 잘 이해하면 그러한 명령을 만드는 것이 쉬울 것입니다. 예를 들어:
#include <stdio.h>
#include<signal.h>
#include<unistd.h>
int flag;
void sig_handler(int signum){
if (flag==1){flag=0;}
else { flag=1;}
}
void main (){
int c;
flag=1;
signal(SIGHUP,sig_handler);
while ((c=getchar())!=EOF){
if (flag==1) {
putchar (c);
}
}
}
내 C는 약간 녹슬어서 최신 코딩 표준에 맞지 않을 수 있지만 HUP가 실행되면 출력이 꺼졌다 켜집니다.
답변2
어떤 해결 방법도 사용할 수 없으며 함수를 정의해야 한다는 사실을 발견했습니다.
spigot(){
if [ -z "$1" ]; then
cat
fi
}
...
while ...
... | spigot $DROP
done