배제해야 할 이유:

배제해야 할 이유:

Bash에서 다음 코드를 실행합니다.

bash /dev/fd/10 10<<-'SES'

    cat <<EMR >> /etc/apache2/apache2.conf
        #
        <Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
        </Directory>
        EMR

SES

그러나 실행이 중단되고 다음을 얻습니다.

경고: 여기서 문서 라인 2는 파일 끝으로 구분됩니다("EMR" 필요).

  • 오류가 무엇을 의미하는지 이해하지 못하며 -탭 이동을 허용하기 위해 연산자와 포함된 구분 문서의 이름 사이에 추가했습니다.
  • 확실히 자리가 없을 것 같아요뒤쪽에이것오프닝 멘트(연산자+이름) 또는 그 이후구분 기호.

참고: 위 코드를 복사하여 컴퓨터에서 테스트하는 경우 아래와 같이 모든 선행 공백을 탭(탭 문자)으로 변경해야 합니다.스택 교환원본 테이블을 공백으로 변경합니다.


배제해야 할 이유:

여기에는 여러 가지 이유가 있을 수 있지만, 제가 배제한 몇 가지 이유는 다음과 같습니다.

1. 문제가 있는 숨겨진 캐릭터:

Notepad++를 사용하여 파일을 편집하고 "모든 기호 표시" 모드를 켜서 모든 들여쓰기가 테이블 기반(빨간색 화살표 참조)이고 모든 줄 끝 문자(EOL)가 LFUNIX 기반(아무것도 없음 CR)인지 확인했습니다.

여기에 이미지 설명을 입력하세요.

그리고 인코딩은 UTF-8이므로 인코딩 문제는 아닙니다.

2. 의사 대시( <<-):

<<-추가된 하이픈( )은 모든 선행 탭을 제거하는 작업을 수행하지 않는 것 같습니다 . 왜냐하면 수동으로 모든 선행 탭을 제거할 때어느(또는 모든 주요 탭각 구분 기호 앞에) heredoc은 예상대로 작동합니다. 사람들이 제안할 수 있어요하이픈진짜가 아니야스프린트상징인데 왜 안돼? 이것을 확인할 방법이 없습니다.

3. 큰 타격 오류:

Windows를 사용하지 않고 Bash를 포함하는 다른 Linux 배포판을 사용하는 사람들에게는 이 문제가 없으므로 이는 Bash 버그가 아닐 가능성이 높습니다. 또한 GNU의 Bash 개발 섹션에서도 이를 테스트했습니다.


Notepad++에서 복사한 데이터의 붙여넣기 손상은 다음과 같을 수 있습니다.

Notepad++의 heredoc을 파일에 붙여넣으면 nano선행 탭이 모두 제자리에 있는 것 같습니다. 붙여넣을 때 제거되지는 않지만 공백으로 변환됩니다.

또한 cat script.sh | grep "^ "and cat script.sh | grep -x '\s*EMR'(파일 디렉터리에서 수행된 경우) 결과는 비어 있습니다.

그러나 나중에 붙여넣는 과정에서 이 문제를 일으킬 가능성이 가장 높은 또 다른 손상 문제를 발견했습니다(내 답변 참조).

답변1

게시한 이미지에는 캐리지 리턴( CR이미지 참조)이 표시됩니다. DOS 형식의 텍스트 파일입니다. dos2unix또는 유사한 유틸리티를 사용하여 파일을 적절한 Unix 텍스트 파일로 변환하십시오.

아래 설명에 따라: Windows에서 반드시 Notepad++로 개발해야 하는 경우(가능한 경우 대상으로 삼고 있는 동일한 OS에서 개발하는 것이 개인적으로 권장됩니다) 프로그램은 "Select" Unix( LF)"를 새 문서 기본 설정에서 Unix 줄 바꿈을 사용하려면 다음을 수행하세요.

Notepad++ 새 문서 설정

파일의 LF마지막 줄 끝에 개행 문자( )가 있는지 확인하십시오.모두Unix 텍스트 파일의 행(셸 스크립트는 텍스트 파일임)필요끝에는 종료 개행 문자가 있습니다. 마지막 줄이 누락된 경우 기술적으로 해당 파일은 실제로 텍스트 파일이 아니라 바이너리 파일입니다.

예를 들어 "로그 파일에서 ^M 문자 제거"

답변2

안타깝게도 터미널 에뮬레이터(예: Ubuntu 상자의 터미널 창)의 디자인은 특히 좋은 붙여넣기 지원을 허용하지 않습니다. 대부분의 경우 붙여넣기는 동일한 내용을 입력하는 것과 똑같이 작동합니다.매우빠른 타이피스트). 터미널에서 실행되는 프로그램의 특수 신호로 생각되는 대부분은 실제로는 대역 내 데이터, 즉 문자일 뿐입니다. 붙여넣기에 해당 문자가 포함되어 있으면 프로그램은 해당 문자를 입력하는 것과 붙여넣는 것의 차이를 구분할 수 없습니다.

따라서 수신 프로그램을 혼란스럽게 할 수 있는 문자가 포함되어 있지 않으면 파일을 전송하기 위해 붙여넣기를 실제로 사용할 수 없습니다. 특히 붙여넣은 탭은 bash를 혼란스럽게 합니다. 탭을 보고 파일 완성이나 명령 완성을 시도합니다. 탭을 입력할 때와 같습니다.

cat > filename붙여넣은 내용에 control-D(예, 문자입니다)가 있으면 이 트릭은 실패할 가능성이 높습니다. 그러나 제어 문자(개행 및 탭 제외)를 피하면 작동합니다.

Unix 사용자는 파일 전송 프로그램을 사용하여 파일을 이동하는 경우가 많습니다. 우리가 가장 자주 사용하는 기본 방법은 scp또는 sftp둘 다 SSH의 일부입니다(완전히 암호화되고 인증되는 등 - SSH에서 제공하는 것과 동일한 보안 보장).

아마도 Windows와 Ubuntu VM(또는 그 반대) 간에 작업하는 가장 쉬운 방법은 하이퍼바이저(VM 제품)의 파일 공유 기능을 사용하는 것입니다. 대부분 이러한 기능이 있습니다. 호스트에서 디렉터리를 선택하면 게스트에 표시됩니다. WSL을 사용하면 에 액세스할 수 있습니다 /mnt/<drive letter>/. 하이퍼바이저에 해당 기능이 없으면 두 번째로 쉬운 방법은 일반 파일 공유를 사용하는 것입니다. Ubuntu에서 Windows 파일 공유를 탑재하거나 Ubuntu에 Samba를 설치하여 Windows에 파일을 공유할 수 있습니다.

수행 중인 작업에 따라 더 나은 방법이 있을 수 있습니다. 예를 들어 자동화된 배포가 있습니다. 어쩌면 파일을 git으로 체크인하고 싶을 수도 있고 그렇게 하면 git push자동으로 Ubuntu 시스템에 배포될 것입니다. 이는 git 후크를 사용하는 것만큼 간단할 수도 있고 훨씬 더 복잡할 수도 있습니다. 전용 패키지가 모두 있습니다.

마지막으로, 이러한 스크립트를 파일에 작성하면(단순히 셸에 붙여넣는 대신) 큰 이점이 있습니다. 파일은 수행 중인 작업에 대한 문서 역할을 합니다. 무엇이 잘못되었나요? 가지 않는 이상진짜오류가 발생했습니다. 파일을 확인하여 이유를 알아보세요. 이를 통해 무엇이 잘못되었는지 정확하게 판단할 수 있으며, 이는 손상 복구의 첫 번째 단계인 경우가 많습니다. 다시 해야 하나요? 파일을 다시 받으시면 됩니다. 비슷한 일을 해야 합니까? 파일을 편집해서 받으세요.

만약 너라면~ 해야 하다여기에 문서를 붙여넣으세요.

bash에 직접 붙여넣고 싶다면 줄바꿈 이외의 제어 문자가 포함되지 않도록 하는 것이 가장 좋습니다. 이것을 붙여 넣으면 작동합니다.

bash /dev/fd/10 10<<'SES'

cat <<EMR >> /etc/apache2/apache2.conf
#
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
EMR

SES

들여쓰기가 필요한 경우 선행하는 대신 공백과 sed를 사용하여 -제거할 수 있습니다(여기서는 구문이 더 간단하고 중요하지 않기 때문에 fd 10 대신 stdin이 계속된다는 점에 유의하세요).

sed -e 's/^\s\+//' <<'SES' | bash

    cat <<EMR >> /etc/apache2/apache2.conf
    #
    <Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
    </Directory>
    EMR

SES

sed의 검색 및 바꾸기 기능( )을 사용하여 s/PATTERN/REPLACEMENT/줄 시작 부분( )에서 한 번 이상 반복되는 공백( ) ^을 찾아서 아무것도 바꾸지 않습니다. 즉, 각 줄의 모든 선행 공백을 잘라냅니다. sed에 대한 옵션은 이것을 실행될 sed 스크립트로 명시적으로 식별합니다. 실제로는 필요하지 않습니다. sed는 어쨌든 첫 번째 인수를 스크립트로 해석합니다. 그러나 개인적으로 항상 .\s\+-e-e

위의 "공백"에는 공백과 탭(여기서는 실제로 관련이 없는 일부 문자도 포함)이 포함됩니다. 어떤 조합을 사용하든 sed는 모든 조합을 잘라냅니다.

물론 왜 명령을 bash에 붙여넣고 bash를 실행하여 cat을 실행하라고 지시하는지 모르겠습니다.

답변3

문제는 의심할 여지없이 Windows에서 발생합니다. TTY 창 크기를 처리합니다. 창 크기가 좁을수록 줄 바꿈( LF) 문자와 캐리지 리턴( ) 문자가 CR많아집니다 .반죽창이 얼마나 좁은지에 따라 붙여넣기에 추가됩니다. 이러한 조합은 다음과 같이 표시됩니다 CRLF.

해결책

Nano의 관리자를 알았다면벤노 슐렌베르그맞습니다. Nano는 조합을 자연스럽게 CRLF후행 공백 문자( ^Jchars )로 변환합니다.

Benno가 나에게 제안한 것처럼 마지막에 다음 코드를 추가하면 /etc/nanorc문제가 해결되었습니다.

bind ^J enter main

해결책을 명확히 하라

한편으로는 ^J암호 해독 문자의 형성을 금지하고 다른 한편으로는 추가됩니다.오직Windows 조합과 달리 LFLinux에서는 복사된 데이터에 줄 바꿈( 문자)을 사용할 수 있습니다.CRLF

개별적으로 추가된 문자는 LF붙여넣은 데이터가 하나의 긴 텍스트 줄로 표시되는 것을 방지하므로 좋습니다.


관련 정보