.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
파일이었고 그 중 하나에 호출이 포함되어 있었습니다.)find
source
tmux
내 가정은 소비되는 입력이 프로세스에서 대체 리디렉션 read
에서 나오므로 이것이 tmux를 차단하고 있다는 것입니다.stdin
stdin
파일 설명자를 매개변수로 전달할 수 있다는 것을 알고 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 구분 기호를 사용하는 것입니다... 이는 훨씬 더 혼란스럽습니다!find
read -d$'\0'
( 나는 찾은 파일만 찾고 싶기 때문에 find
를 사용할 수 없으며 , 이는 명백한 이유로 상위 프로세스에서 수행되어야 합니다.)-exec
source
파일을 안전하게 반복하는 "더 나은" 방법이 있습니까 source
?아니요블록 stdin
또는 stdout
?