문자열을 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"
}