tmux 서버가 실행되고 있지 않으면 tmux ls 출력을 grep할 수 없습니다.

tmux 서버가 실행되고 있지 않으면 tmux ls 출력을 grep할 수 없습니다.

해당 정보로 zsh 프롬프트를 업데이트할 수 있도록 tmux 서버가 실행 중인지 확인하는 방법을 찾으려고 합니다.

tmux 서버가 활성화된 경우

> tmux ls
0: 1 windows (created Sat Jul 10 13:47:36 2021) (attached)

그럼 출력을 grep할 수 있겠죠?

그렙 출력:

> tmux ls | grep -i "windows"
0: 1 windows (created Sat Jul 10 13:47:36 2021)

windows(나의 경우) 색상 red이거나 터미널에 있는 색상이면 명령이 작동합니다.

이 단어가 출력 windows에 항상 나타나기 때문에 이 단어를 선택했습니다 .tmux ls

이제 서버가 오프라인인지 확인하세요.

tmux 서버를 종료한 후:

tmux kill-server

이제 다음 명령을 사용하여 서버가 활성화되어 있는지 확인합니다.tmux ls

> tmux ls
no server running on /tmp/tmux-1000/default

예상대로 정상적인 출력입니다.

greptmux 서버가 죽으면 실패하는 것 같습니다. 다음 이상한 점을 확인하십시오.

> tmux ls | grep -i "windows"
no server running on /tmp/tmux-1000/default

exit code명령:

> echo $?
1

failed출력을 가져오는 grep을 의미합니다 .

또 다른 테스트 사례에서는 이상한 동작을 보여줍니다.

> tmux ls > file.txt
no server running on /tmp/tmux-1000/default

무엇을 실행하든 항상 no server ... bla bla화면에 인쇄됩니다.

파일을 캡처할 때:

> cat file.txt

비어 있는

해당 정보로 zsh 프롬프트를 업데이트할 수 있도록 tmux 서버가 실행 중인지 어떻게 확인합니까?

참고: $TMUX세션에 있는지 여부를 알고 싶지 않지만 이미 세션에 있는지 알고 싶지 않기 때문에 변수는 나에게 소용이 없습니다. 이는 말이 되지 않습니다. 세션에 연결되어 있는지 여부에 관계없이 서버가 alive인지 알고 싶습니다 .dead

추가의(zsh 사용자에게만 해당)

tmux 서버 상태를 zsh 프롬프트에 넣으려면 다음과 같은 결과를 얻습니다. 여기에 이미지 설명을 입력하세요.

이를 얻으려면 다음 줄을.zshrc

function update_prompt_and_venv () {
  if tmux ls &> /dev/null; then
      tmux_server="%{$terminfo[bold]$fg[black]%}(%{$terminfo[bold]$fg[green]%}tmux%{$terminfo[bold]$fg[black]%}) "
  fi
  PROMPT="
$tmux_server ... $your_cwd
> "
}
precmd_functions+=(update_prompt_and_venv)

콘텐츠:

  • 터미널에서 Enter 키를 누를 때마다 호출되는 함수
  • tmux 서버 상태에 따른 변수
  • 기능 업데이트 팁
  • precmd_functions각 입력 명령 전에 호출되도록 함수를 추가하십시오.

서버 종료 후 Enter 키를 누르면 업데이트 내용이 바로 표시됩니다.

답변1

귀하의 혼란은 tmux다른 모든 유틸리티와 마찬가지로 오류 메시지 및 기타 진단 메시지가표준 오류 스트림하기보다는표준 출력 스트림. 리디렉션을 사용하면 >오류 메시지가 아닌 표준 출력 스트림만 리디렉션됩니다. 마찬가지로 명령 출력을 파이프하면 오류 메시지가 아닌 표준 출력 스트림만 파이프됩니다. 이것은 의도적으로 설계된 것입니다.

그러나 여기서는 grep아무것도 할 필요가 없으며 대신 tmux종료 상태 자체를 조사하는 데 의존할 수 있습니다.

세션이 존재하는지(또는 세션이 존재하는지 여부를 알려주기 위해 존재하는 has-session하위 명령이 있습니다.tmux특정한세션이 존재함):

has-session[ -t target-session]
(별칭: has)

지정된 세션이 존재하지 않으면 오류가 보고되고 1로 종료됩니다. 존재하는 경우 0으로 종료합니다.

이는 다음을 사용할 수 있음을 의미합니다.

if tmux has-session 2>/dev/null; then
    echo session exists
else
    echo no sessions
fi

이는 특정 문자열의 존재 여부를 조사하는 데 의존하며 tmux has-session명령 출력을 구문 분석할 필요는 없습니다.

/dev/null우리는 그것을 폐기하는 데 사용하기 위해 오류 스트림을 리디렉션합니다 2>/dev/null. tmux사용 가능한 세션이 없으면 명령은 오류 메시지를 인쇄하지만 해당 메시지에는 관심이 없습니다.

답변2

tmux ls | grep -i "windows"관로표준 출력tmux ls항목 의 메시지가 인쇄됩니다 grep.no server running on /tmp/tmux-1000/default표준 에러, 표준 출력이 아닙니다.

stdout 및 stderr을 grep하려면 stderr을 stdout과 동일한 위치로 리디렉션해야 합니다. 예를 들어:

tmux ls 2>&1 | grep -i "windows"

아니면 stderr를 다음으로 리디렉션하세요 /dev/null.

tmux ls 2>/dev/null | grep -i "windows"

그런데 실제로 grep의 출력을 표시해야 하는 경우가 아니면 greps -q(또는 --quiet, --silent) 옵션을 사용하고 grep의 종료 코드를 확인해야 합니다. 예를 들어

tmux ls 2>/dev/null | grep -i -q "windows"

if [ $? -eq 0 ] ; then
  echo "tmux is running for $USER"
else
  echo "tmux is not running for $USER"
fi

답변3

유닉스에서 프로그램이 시작되면 핸들 없이 3개의 파일이 열립니다: STDIN STDOUT SDERR

리디렉션은 |일반적으로 첫 번째 프로그램의 STDOUT을 두 번째 프로그램의 STDIN으로 보냅니다. "실행 중인 서버 없음"과 같은 오류는 STDERR로 이동하며 일반적으로 파이프나 기타 리디렉션이 아닌 터미널에서 종료됩니다.

STDOUT과 STDERR을 모두 캡처하려면 조금 더 수행해야 합니다. bash, zsh 및 최신 쉘에서는 다음과 같이 작동합니다.

tmux ls |& grep...

이전 쉘(및 현재 쉘)에서는 다음을 수행해야 합니다.

tmux ls 2>&1 | grep...

이는 쉘이 STDOUT에 파이프를 생성한 다음 첫 번째 명령을 실행하기 전에 STDERR 파일 핸들(2)을 STDOUT(1) 파일 핸들의 복사본으로 바꾸도록 지시합니다. 여기서는 2>&1및 의 순서 |가 중요합니다.

grep을 포함하지 않는 더 간단한 대안은 실행 tmux ls한 다음 출력에서 $?​​오류를 확인하는 것입니다. 이는 다른 tmux 오류와 구별할 수 없습니다. 예를 들어

if ! tmux ls
then
    # do this when tmux errors
fi

관련 정보