tmux는 읽기 루프에서 실행 중일 때 TTY를 찾을 수 없습니다.

tmux는 읽기 루프에서 실행 중일 때 TTY를 찾을 수 없습니다.

.bashrc소스 스크립트(예: my ) 의 while read루프 내에서 tmux를 실행 하려고 합니다 . 그러나 이렇게 하면 tmux가 TTY를 찾을 수 없으며 다음 오류가 발생합니다.

open terminal failed: not a terminal

아무리 가짜라도 재현 가능한 최소한의 예는 다음과 같습니다.

while read -r _session; do
  tmux new-session -s "${_session}"
done < <(printf "%s\n" "$@")

(제 경우에는 .bashrc실제로 파일에 대한 printf파일이었고 그 중 하나에 호출이 포함되어 있었습니다.)findsourcetmux

내 가정은 소비되는 입력이 프로세스에서 대체 리디렉션 read에서 나오므로 이것이 tmux를 차단하고 있다는 것입니다.stdinstdin

파일 설명자를 매개변수로 전달할 수 있다는 것을 알고 read이를 사용하여 문제를 해결하려고 했습니다.

_tmp="$(mktemp)"
printf "%s\n" "$@" > "${_tmp}"

exec 3< "${_tmp}"
while read -ru 3 _session; do
  tmux new-session -s "${_session}"
done
exec 3<&-

이것은 효과가 있지만 정말 지저분합니다. 그러나 아마도 더 중요한 것은 앞서 언급했듯이 반복하려는 것은 출력입니다. find이 시점에서 파일 이름 파일을 한 줄씩 반복하고 관련된 모든 문제를 해결하게 됩니다. 현재 제가 생각할 수 있는 가장 좋은 해결책은 , -print0플래그를 사용하고 Null 구분 기호를 사용하는 것입니다... 이는 훨씬 더 혼란스럽습니다!findread -d$'\0'

( 나는 찾은 파일만 찾고 싶기 때문에 find를 사용할 수 없으며 , 이는 명백한 이유로 상위 프로세스에서 수행되어야 합니다.)-execsource

파일을 안전하게 반복하는 "더 나은" 방법이 있습니까 source?아니요블록 stdin또는 stdout?

관련 정보