이미지를 읽고 클립보드에 쓰는 동안 표시하는 간단한 명령을 만들려고 합니다. 내가 시도한 것과 실패한 이유는 다음과 같습니다.
cat pic.png | tee >(xclip -selection clipboard -t image/png -i) | display -
표시된 이미지를 볼 수 없기 때문에 실패합니다.뒤쪽에xclip 프로세스가 종료됩니다
maim -s | tee >(display -) | xclip -selection clipboard -t image/png
이 역시 실패합니다. 왜냐하면 이미지가 클립보드에 저장될 때까지 저장되지 않기 때문입니다.뒤쪽에표시 프로세스가 종료됩니다.
maim -s | tee >(display -) >(xclip -selection clipboard -t image/png)
maim -s | tee >(xclip -selection clipboard -t image/png) >(display -)
이 두 가지도 실패하고 각각 사례 1 및 2와 유사하게 동작합니다.
임시 파일에 의존하지 않거나, 작성한 후 바로 클립보드를 읽지 않고도 이 작업이 가능합니까?
고쳐 쓰다:
s를 연결하면 tee
이상한 결과가 발생합니다.
maim -s | tee >(display -) | tee >(xclip -selection clipboard -t image/png)
이 부분은 작동하여 display
전체 이미지를 표시하지만 클립보드에는 손상되거나 불완전한 복사본만 포함되어 있습니다. 즉, 김프에 붙여넣으면 10%만 붙여넣고 나머지는 회색으로 표시됩니다. 병렬 예시: 클립보드의 내용을 김프에 표시하고 붙여넣기.
maim -s | tee >(xclip -selection clipboard -t image/png) | tee >(display -)
이것도 부분적으로 작동하며 전체 이미지가 클립보드에 배치되지만 오류와 함께 표시되지 않습니다.
display: no decode delegate for this image format `' @ error/constitute.c/ReadImage/566.
업데이트 2:
글쎄요, 휴대성은 물론이고 "우아한" 방식으로 이 작업을 수행하는 쉬운 방법은 아닌 것 같습니다. 따라서 가장 좋은 방법은 세 단계로 수행하는 것입니다.
- 파이프 2개 생성
mkfifo /tmp/p1 /tmp/p2
- 이미지를 가져와 해당 파이프에 씁니다.
maim | tee /tmp/p1 /tmp/p2
- 두 파이프에서 동시에 읽기
display < /tmp/p1 & xclip ... < /tmp/p2
두 줄로 할 수도 있지만 요점을 알 수 있습니다.
또 다른 해결책은 매뉴얼 페이지에서 xclip의 필터 플래그를 사용하는 것입니다.
-f, -filter when xclip is invoked in the in mode with output level set to silent (the defaults), the filter option will cause xclip to print the text piped to standard in back to standard out unmodified
따라서 다음과 같습니다.
maim -s -f png | xclip -i -f -selection clipboard -t image/png | display
이것이 xclip을 사용하는 가장 좋은 방법이자 예상되는 방법인 것 같습니다.
답변1
전체 데이터를 메모리에 어느 정도 버퍼링해야 합니다. 즉, tmp 파일에 쓸 수도 있습니다 /dev/shm
.
또 다른 옵션은 버퍼 프로그램입니다.
tee <pic.png >(buffer | xclip -selection clipboard -t image/png -i) | display -
buffer
파일 크기를 미리 확인하고 buffer
그에 따라 옵션을 설정할 수 있도록 충분한 메모리를 사용해야 할 수도 있습니다 .