Bash 셸이 복사하여 붙여넣은 중복 텍스트를 "무시"할 수 있나요?

Bash 셸이 복사하여 붙여넣은 중복 텍스트를 "무시"할 수 있나요?

GUI 텍스트 편집기에 "Quick&Dirty" Perl 스크립트가 있고 Bash를 실행하는 터미널 창에서 Perl 인터프리터를 시작한다고 가정합니다. Perl 스크립트를 복사하여 터미널에 붙여넣고 CTRL-D를 눌러 Perl을 사용하여 실행할 수 있습니다. Perl은 스크립트를 해석하고 실행합니다.

때때로 스크립트에 오타가 있어 Perl이 치명적인 오류를 인쇄하고 종료되지만 복사하여 붙여넣은 나머지 텍스트는 실행을 시도하는 Bash 쉘로 전달되어 실패하거나(행운의 경우) 실행되지만 다른 작업을 수행합니다. (불행한 상황).

예: Bash 프롬프트에서 Perl을 시작하고 스크립트 5줄을 복사하여 붙여넣습니다. 1행과 2행은 괜찮지만 3행으로 인해 Perl이 비정상적으로 종료되므로 4행과 5행이 Bash에 의해 실행됩니다.

저는 단지 Perl과 Bash를 예시로 사용했습니다. 다른 많은 대화형 도구(예: Python, fdisk) 및 기타 셸(예: zsh, csh)에서는 문제가 발생할 수 있습니다.

텍스트가 복사하여 붙여넣기 입력이므로 무시할 수 있음을 쉘에 알리는 방법이 있습니까?
"사용자가 일반적으로 입력할 수 있는 것보다 빠르면 무시"와 같은 것이 있습니까?
아니면 "프로세스가 완료되면 다음 쉘 입력을 읽기 전에 입력 버퍼를 플러시합니다"와 같은 것입니까?

[[일부 도구에는 이 문제가 없습니다. 예를 들어 MySQL cli는 잘못된 입력으로 인해 종료되지 않습니다. ]]

답변1

이는 답변은 아니지만 아마도 허용되는 해결 방법일 수 있습니다.

alias p='perl; echo hit control-d again; cat > /dev/null'

그런 다음 Perl 스크립트가 조기에 종료되면 나머지 내용을 /dev/null에 안전하게 붙여넣게 됩니다. Perl 스크립트가 성공하면 친숙한 알림이 표시되고 Ctrl-d를 눌러 catcher를 종료합니다 cat.

답변2

Jeff Schaller의 "솔루션/해결 방법" 외에도 올바른 솔루션은 "브래킷-붙여넣기 모드"라고 하는 발신자와 수신자 모두의 복사-붙여넣기를 환경에서 인식하도록 만드는 것 같습니다.
~에서https://cirw.in/blog/bracketed-paste, 자세한 내용을 설명하는 짧은 스니펫은 다음과 같습니다.

간단히 말해서:

  1. 대괄호 붙여넣기 활성화: printf "\e[?2004h"
  2. 붙여넣기가 시작될 때까지 기다리세요. STDIN에 \e[200~가 표시됩니다.
  3. 붙여넣기가 중지될 때까지 기다리세요. STDIN에 \e[201~가 표시됩니다.
  4. 대괄호 붙여넣기 비활성화: printf "\e[?2004l"

아직 Bash에서 완전히 사용할 수 없으므로 Jeff Schaller의 답변을 수락하겠습니다. 이는 저에게 효과적이었습니다.

답변3

터미널에 붙여넣는 대신 클립보드에서 명령을 읽어보세요. 당신은 그것을 사용할 수 있습니다클립또는셰르클립보드의 내용을 인쇄합니다(또는 반대로 입력 내용을 클립보드에 씁니다).

xsel | perl           # automatic selection (click+drag, middle click)
xsel -b | perl        # manual selection (Ctrl+C, Ctrl+V)

이는 터미널의 셸이 X 서버에 액세스할 수 있는 경우에만 작동합니다. 예를 들어 X11 연결을 전달하지 않는 SSH 세션에서는 작동하지 않습니다.

OSX에서는 다음을 사용하세요.pbpaste임시 보드 내용을 검색합니다.

관련 정보