연속 출력을 rofi로 파이프

연속 출력을 rofi로 파이프

문자열을 rofi로 파이프하는 bash 스크립트를 작성하려고 합니다. 이러한 문자열은 함수에 의해 지속적으로 생성됩니다 gen_x.

이 함수는 gen_x때때로(조건이 충족되는 경우에만) 새 문자열을 출력합니다. 저는 현재 gen_x무한 루프에서 if 문(함수)을 구현하고 있습니다. 이 기능을 rofi로 파이프하고 싶습니다. rofi에서 항목이 선택되면 rofi는 선택한 항목을 출력 gen_x하고 rofi는 끝나야 합니다.

매번 새로운 요소를 출력하는 무한 루프를 사용하면(그림 참조 gen_b) 스크립트는 위에서 설명한 대로 정확히 수행됩니다. 그러나 함수에서 if 문을 구현하고 조건이 true인 경우에만 새 요소를 인쇄하면 프로그램이 종료되지 않습니다. 이것이 rofi 때문인지 확실하지 않습니다 gen_x.

코드를 단순화하세요

gen_a(){ while true; do if [[ "$v" == "" ]]; then echo "Test"; v=1; fi; sleep 1; done }
gen_b(){ while true; do                             echo "Test";            sleep 1; done }

gen_a | rofi -dmenu # -> this outputs Test and does not end
gen_b | rofi -dmenu # -> this outputs Test and ends properly

while 루프에서 조건을 사용하여 프로그램을 올바르게 종료시키는 방법이 있습니까?

답변1

rofi아니요비동기 모드로 전환기본적으로 25줄의 입력을 읽기 전입니다. 이는 다음을 통해 변경할 수 있습니다.

-async-pre-read [number] 비동기 모드로 전환하기 전에 여러 차단 항목 읽기

옵션.

그래서:

cmd | rofi -async-pre-read 1 -dmenu

한 줄을 읽자마자 메뉴를 표시하도록 하세요 cmd.

항목을 선택하면 rofi인쇄되고 종료됩니다. cmd그 후 다음에 평소와 같이 stdout(지금은 깨진 파이프)에 쓸 때 SIGPIPE에 의해 종료됩니다.

즉시 죽이려면 일반적인 방법은 다음과 같습니다.

sh -c 'echo "$$"; exec cmd' | {
  IFS= read -r pid
  rofi -async-pre-read 1 -dmenu
  kill -s PIPE "$pid"
}

관련 정보