여기 문서를 Bash에 복사하여 붙여넣으면 탭이 점으로 변환됩니다.

여기 문서를 Bash에 복사하여 붙여넣으면 탭이 점으로 변환됩니다.

저는 Windows 10 홈(빌드 16299.248)을 사용하고 있으며 다양한 SSH 클라이언트(예: Putty/MobaXterm)를 사용하여 원격 Ubuntu 16.04 시스템에 SSH로 연결하고 있습니다.

개인 GitHub 계정에서 다음 코드를 복사하여 SSH 세션에 붙여넣습니다.

cat <<-EOF >> "$HOME"/.bashrc
    export s_a="/etc/nginx/sites-available"
    export s_e="/etc/nginx/sites-enabled"
    export drt="/var/www/html"
    source "$HOME"/"$repo"/software_internal.sh
EOF

나는 그것을 복사한다내 GitHub 계정에서 직접 여기(비원시 버전)GitHub raw 버전에서 복사해도 다음과 같은 문제가 발생합니다.

내 문제

원격 Bash의 결과는 다음과 같습니다.

> .export s_a="/etc/nginx/sites-available"
> .export s_e="/etc/nginx/sites-enabled"
> .export drt="/var/www/html"
> .source "$HOME"/"$repo"/software_internal.sh
> EOF

거의 각 줄의 시작 부분에 있는 단일 점에 주목하세요.

뭔가가 표를 단일 점으로 변환하고 있습니다.

사리

  • 방금 설명한 문제는 다양한 유형의 SSH 클라이언트에서 발생합니다.

  • 또한 사람들은 Linux 시스템(Debian, Ubuntu)에서 문제를 복제할 수 있었습니다. 또한 WSL(Linux용 Windows 10 하위 시스템)을 사용하는 경우 Powershell이든 CMD이든 문제가 없습니다. 또한 Windows 10에서는 어떤 종류의 페이스트보드/클립보드 관리자도 사용하지 않습니다.

  • GitHub가 기존에 없던 탭 문자를 사용하고 있다는 증거도 없습니다.

  • Mozilla Firefox 또는 Google Chrome에서 복사할 때 발생합니다.

  • DigitalOcean Ubuntu Bash를 설치한 후(DigitalOcean 용어로 "droplet"을 만든 후) 아무것도 변경하지 않았습니다.

이것은 의 버그인 것 같습니다 GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu). Bash 5.2에서도 Debian stable 9.3의 버그를 복제할 수 있었습니다. 하지만 이 문제는 Arch에서는 발생하지 않으므로 데비안 배포판에서만 발생할 수 있습니다.

추가 정보

문제는 DigitalOcean뿐만 아니라 Linode에서도 발생합니다. Linode 엔지니어는 Ubuntu 14.04, 16.04 및 17.04에서 이 문제를 재현할 수 있었습니다.

DigitalOcean과 Linode가 Ubuntu를 동일한 방식으로 사용자 정의할 수 있으며 버그는 Bash에는 없지만 여전히 DigitalOcean과 Linode에 고유합니다.

요약

위의 문제는 Windows 10, SSH 클라이언트, GitHub GUI 또는 웹 브라우저에서 발생할 가능성이 거의 없습니다. 데비안 저장소, 4.3/5.2/기타의 Bash 또는 Debian-Bash의 조합에서 나올 가능성이 높습니다.

내 질문

이 문제에 대처하는 올바른 방법은 무엇입니까? 물론 heredocument 탭을 삭제할 수도 있지만 확실히 원하지 않는 일입니다. 탭은 여기 문서를 더 잘 구성하는 데 도움이 됩니다.

답변1

Bash는 heredoc 내에서 파일 이름 완성을 수행하고 있습니다. 귀하의 디렉토리에는숨겨지지 않은파일('.'로 시작하지 않는 파일)이므로 가장 긴하위 문자열디렉토리에 있는 모든 파일 이름의 시작 부분과 일치하는 문자는 '.'이며, 이것이 제공되고 입력에 남게 됩니다.

동일한 버전의 Bash는 내가 시도한 모든 곳에서 이러한 동작을 나타내므로 특정 VPS 공급자에만 국한되지는 않습니다. 완료를 완전히 비활성화하지 않고는 이 작업을 중지할 수 없었습니다(따라서 "Linode가 배포판 이미지를 수정하기 위해 수행해야 할 작업은 다음과 같습니다."). 그러나 특정 용도에 대한 몇 가지 해결 방법이 있습니다.

  1. Bash 자체에서 아무것도 변경하지 않고 가장 쉬운 수정은숨겨지지 않은$HOMEheredoc가 시작되기 전에 디렉터리( )에 파일을 저장합니다 . 그러면 파일 이름 완성이 0자와 일치하게 됩니다. say 로 이를 수행할 수 있습니다 touch "$HOME"/myFile.

  2. readline이 비활성화된 상태에서 쉘을 실행하고 거기서 원하는 작업을 수행하십시오.bash --noediting

  3. heredoc 전에 완료를 해제합니다.bind 'set disable-completion on'

관련 정보