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)
(여기서 xsel
stdout은 파이프임) 또는:
xsel -b > selection.txt
(여기서 xsel
stdout은 일반 파일입니다).
이것이 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을 통해 전달됩니다. 다음은 매우 이상한 일이 진행되고 있는 것이므로 커널과 오랫동안 대화해야 합니다. .