WSL - CMD에 붙여 넣은 Bash 코드에 추가되는 후행 공백 창 크기 당 WSL TTY


6

Windows에서 Bash 스크립트를 몇 개 가지고 있으며 메모장에서 WSDL (CMD 기반) 터미널 에뮬레이터 (TTY)로 복사하여 실행합니다.

문제 :

후행 공백 (나노 그린 박스)는 다음 명령을 통해 WSL Nano에 복사하여 붙여 넣을 때 각 스크립트에 추가됩니다.

nano ~/script.sh

이 후행 공백 문자는 스크립트의 일부가 아니며 Linux에서 실제로 실행을 중단하므로 따라서는 안됩니다.

WSL TTY 창이 더 좁을수록 붙여 넣기시 더 많은 캐리지 리턴이 형성됩니다.

스크립트에는 다음 내용이 포함되어 있습니다. 녹색 상자 파일을 저장할 때 이러한 문자를 벗겨 내지 않는 것처럼 보이는 Nano로 열면 Nano의 버그라고 주장 할 수 있지만 실제로는 dos2unix 또한 파일에서 후행 공백을 제거하지 않습니다.

enter image description here

enter image description here

원하는 상황 :

Windows에서 WSL Nano로 Bash 스크립트 (또는 다른 데이터)를 복사하여 붙여 넣을 때 뒤 따르는 공백이 복사되지 않기를 바란다.

추가 정보 :

https://github.com/Microsoft/BashOnWindows/issues/2006

https://savannah.gnu.org/bugs/?50879

WSL에서 재현하려고하는 경우 :

  1. Unix EOL (LF)이있는 Notepad ++에서 스크립트를 복사하고 표제 들여 쓰기 만 포함하십시오.
  2. nano 스크립트 파일이 다음으로 끝나는 지 확인하십시오. .sh그래서 Bash가 강조 표시됩니다. 아직 가지고 있지 않다면, 원격 우분투 서버에 SSH 터널을 설치하고 같은 방법으로 스크립트 파일을 생성하면이 동작을하지 않아야합니다.
  3. 어느 쪽이든 귀하의 나노 창이 좁은 지 (뷰포트의 약 25-50 %) 텍스트의 많은 부분을 붙여 넣는 지 확인하십시오.

2
코멘트는 확장 토론이 아닙니다. 이 대화는 채팅으로 이동 .
Journeyman Geek

답변:


5

앞서 말씀 드렸듯이 좁은 창에 텍스트를 붙여 넣으면 Unix 줄 끝 (LF)으로 문제가 발생합니다.

다음을 사용하는 것을 고려하십시오. 오토 핫키 스크립트가 클립 보드 텍스트를 "타이핑"하여 줄 바꿈 문자를 처리하게합니다.

SendMode Input  ; Recommended for superior speed and reliability.

; Upon pressing Ctrl+Alt+v
^!v::  
    ; SendRaw "types" the contents of the variable.  When it encounters either
    ; Cr (`r) or Lf (`n), it sends an "Enter", thus CrLf sends Enter twice.

    ; Replace any CrLf with Lf (ironic, I know), leaving the clipboard as is
    newClip := StrReplace(clipboard,"`r`n","`n")
    SendRaw %newClip%
return

2

Nano 개발팀의 Benno Schulenberg가 제안한 것처럼 / etc / nanorc의 끝에 다음 코드를 추가하면이 문제가 해결되었습니다.

bind ^J enter main

한편으로 이것은 후행 공백의 형성을 불가능하게하고 다른 한편으로는 Windows에서 복사 된 데이터에 라인 피드 (LF 문자)를 추가하므로 하나의 긴 행에는 나타나지 않습니다.

자세한 내용은 여기를 참조하십시오. .


0

넓은 그림에서 당신은 보여줍니다 : ....

...cd maldetect-* &&␠|<-window boundary
bash ./install.sh

(세로 막대 앞에있는 문자는 HTML 또는 유니 코드 char U + 2420 (공백 기호).

그 공간은 거기에 있어야합니다 (HAS). 윈도우 경계가 없다면, 다음 줄은 다음과 같습니다.

...cd maldetect-* && bash ./install.sh

공간이 없으면 & amp; & amp; 공간이 없다. 그것과 'bash'단어의 시작 사이에 해서는 안된다. bash에서 실행하는 경우 상처를 입지 만, 예를 들어 일반적으로 이중 앰퍼샌드와 공백 사이에는 공백이 있어야합니다.

당신의 공간이 거기에 있어야한다면, 당신의 문제를 일으키는 원인이 될지도 모릅니다 ... 흠 .... ARG! 당신은 이것을 "에"붙입니다 ... 배쉬 ... 어 ... 오 ...

bash에 붙여 넣는 경우 bash는 몇 년 전에 자동 완성 된 변경 사항으로 인해 붙여 넣기에 '버그가 있습니다'(의견 수사)입니다. 만약 당신이 붙여 넣은 텍스트에 'TAB'이 있다면 (예, 들여 쓰기) bash의 "autocomplete"기능을 호출 할 것입니다. (필자는이 점에 대해 불평하지만 아무도 bash에 텍스트를 붙여 넣지 않는다고 들었습니다. 기침 , 기침 ) ('bug-bash@gnu.org list '에 불만을 토로한다. 그것이 자동 완성을 호출 할 때 - 많은 시간에 질문을하기 때문에 붙여 넣은 텍스트의 다음 문자를 삼킬 것입니다 :

> ls <'complete-key' pressed>
Display all 199 possibilities? (y or n)

일반적으로 붙여 넣은 텍스트가 손상됩니다. 어쨌든 내 탭은 일반적으로 빈 줄 (코드를 들여 쓰고 있기 때문에) 때문에 나에게 문제가되지 않았다. 예전에는 공백 행 (@ 행 시작 또는 공백 만 눌 렸을 때 앞에 공백이있는 경우)에서 코드 완성 누름을 무시하는 옵션이있었습니다. 이것은 빈 명령 줄 (빈 tty 줄이 아님)에서 완료 문자 만 무시하도록 변경되었습니다. 여러 commmands를 입력에 붙여 넣는 것은 보통 bash로 간주됩니다. 빈 명령 행이 아닙니다. 말할 필요도없이 이것은 많은 문제를 일으 킵니다.

나를위한 불완전한 해결책은 TAB에서 코드 완성 키를 다시 매핑하는 것이 었습니다. 역 인용 ( " ") (above tilde key). (same bug occurs if you have 귀하의 텍스트에서,하지만 나를 위해, 나는 그것을 덜 자주 많이 사용합니다. 홈 디렉토리의 '.inputrc'파일에서 'readline'(라인을 읽거나 편집을 허용하기 위해 bash가 사용하는 방법)을 제어하고 동작합니다. 특히, ".inputrc"섹션에는 bash 관련 설정 옵션이 있습니다 :

$if bash
# use backquote as completion (yes, that's shift-'~')
# not ideal, but quickest "hack" to get mostly 
# transparent pasting (backquote isn't used nearly as often as TAB) 
TAB:tab-insert
"`":complete
$endif

대안 : 1) 붙여 넣기 전에 모든 탭을 공백으로 변환하십시오. 따라서 TAB은 명령 완료를 트리거하지 않습니다. 2) 항상 텍스트를 파일에 씁니다. 파일을 소스 (.) 만들거나 실행 파일로 만들고 첫번째 줄에 '#! / bin / bash'를 추가하여 쉘 스크립트로 만드십시오.

이론적으로는 명령 완성도를 떨어 뜨릴 수 있어야하지만 너무 많이 사용하므로 시도하지 않아도됩니다.

지금 내가 일반적으로하는 일은 1 개의 창 (일반적으로 gvim)에서 스크립트를 편집하는 것이며 gvim을 시작한 창에서 스크립트의 연속적인 반복을 실행하여 '붙여 넣기'를 피합니다. 확실히 제 1 선택은 아니었지만 bash는 완전한 키가 그 방향으로 나를 밀어 넣은 후에 물건을 삼켜 버리는 입력을 부패 시켰습니다.

버그를보고 할 경우 해결책을 제시 할 준비를하십시오! ;-)이 문지름입니다 :

> ls \<carriage return>
>> [here people want to be able to hit 'TAB' and get an autocomplete of
    of the files in the current directory.  It looks like an empty line,
    but it is a really a continued command line from the previous line.

bash에 명령을 붙여 넣을 때도 똑같은 일이 발생합니다 ... 일부는 탭을 사용하여 원하는 것을 원하지 않습니다 ...

(Ps 희망이 도움이되고 난 완전히 왼쪽 필드로 이동하지 않았지만 '붙여 넣기'언급했을 때 bash - script ...처럼 보이고 탭을 사용하여 언급 한 (들여 붙이기도 함) 내가 만난 똑같은 문제가 그렇듯이.

완벽한 키로 역 따옴표를 사용하는 것은 때로는 조금 어색하지만, 너무 자주 붙여 넣기 된 텍스트 탭이 있습니다 ... 오 잘)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.