xsel은 개행 없음 경고를 어떤 스트림에 인쇄합니까?

xsel은 개행 없음 경고를 어떤 스트림에 인쇄합니까?

xsel은 명령줄에서 시스템 클립보드에 액세스할 수 있는 프로그램입니다. 복사된 내용 끝에 개행 문자가 없으면 클립보드 내용 뒤에 다음과 같이 경고가 인쇄됩니다.

$ xsel -b
copied text
\ No newline at end of selection

이전에는 이 경고가 stderr에 인쇄될 것이라고 생각했지만 오늘 stderr이 stdout과 병합되어도 경고가 없다는 것을 발견했습니다. xsel-b |& less경고 없이 복사된 텍스트만 인쇄됩니다. 왜 이런가요?

답변1

이 내용은 xsel아직 게시되지 않았습니다 xsel.이 변화2008 년에.

X 선택 항목에는 개행 문자로 끝나지 않는 텍스트가 포함되는 것이 일반적입니다. 있는 그대로 덤프하면 종료되지 않은 줄이 표시됩니다. bash모니터와 같은 오래된 케이스를 사용하면 다음과 같습니다.

bash-4.4$ xsel -b
xselbash-4.4$

(여기에 클립보드 선택 항목이 포함되어 있습니다 xsel). 결국 다음 프롬프트가 선택 항목에 추가됩니다.

최신 쉘은 마지막 명령의 출력이 개행 문자로 끝나지 않는 시기를 감지한 다음 시각적 표시를 제공하여 이 문제를 해결합니다 zsh.fish

그리고 zsh:

prompt% xsel -p
xsel%
prompt%

( %누락된 줄 바꿈 이후의 반전 영상을 나타냅니다.)xsel

그리고 fish:

prompt ~> xsel -p
x⏎
prompt ~>

최신 버전은 xsel자신에 대한 시각적 표시를 제공합니다.

bash-4.4$ xsel -b
xsel
\ No newline at end of selection
bash-4.4$

이제 이는 xsel이 이전 대화형 셸의 프롬프트에서 실행되는 경우에만 작동합니다.

특히, "no newline" 지시문은 다음과 같이 사용될 때 바람직하지 않습니다:

selection=$(xsel -b)

(여기서 xselstdout은 파이프임) 또는:

xsel -b > selection.txt

(여기서 xselstdout은 일반 파일입니다).

이것이 xsel바로 이 표시가 stdout이 tty 장치로 갈 때만 출력되는 이유입니다.

이제 어디에 표시되나요? 음, 목적은 그것을 tty 장치에 표시하는 것입니다. strace에서 실행하면 다음이 표시됩니다.

$ strace -e write ./xsel -b
write(1, "xsel", 4xsel)                     = 4
write(2, "\n\\ No newline at end of selectio"..., 34
\ No newline at end of selection
) = 34
+++ exited with 0 +++

이는 확인합니다원천: stderr로 출력됩니다. stdout이 터미널이 아닌 경우:

$ strace -e write ./xsel -b  > /dev/null
write(1, "$ strace -e write ./xsel -b | ca"..., 104) = 104
+++ exited with 0 +++

전혀 출력이 아닙니다. 이제 해당 알림을 터미널에 출력하려는 ​​의도가 있을 때 stderr에 출력하는 것은 약간 어리석은 일이라고 말할 수 있습니다(예를 들어 stderr는 로그 파일로 리디렉션될 수 있음 xsel -b 2> logfile).

  • 일반적으로 stdout이 터미널 장치인 경우 stderr도 터미널 장치입니다.
  • 즉, 터미널에서 실행하는 동안 알림을 비활성화할 수 있으며 xsel -b 2> /dev/null이는 xsel -b | cat.
  • isatty()터미널에 연결되지 않은 직렬 장치에 대해 true를 반환합니다.

답변2

테스트는 쉽습니다:

xsel -b > xsel.out 2> xsel.err

메시지는 두 파일 중 하나에 있습니다. 에 있으면 xsel.out메시지는 stdout을 통해 전달되고, 다른 파일에 있으면 stderr을 통해 전달됩니다. 다음은 매우 이상한 일이 진행되고 있는 것이므로 커널과 오랫동안 대화해야 합니다. .

관련 정보