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)가 LF
UNIX 기반(아무것도 없음 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 줄 바꿈을 사용하려면 다음을 수행하세요.
파일의 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
후행 공백 문자( ^J
chars )로 변환합니다.
Benno가 나에게 제안한 것처럼 마지막에 다음 코드를 추가하면 /etc/nanorc
문제가 해결되었습니다.
bind ^J enter main
해결책을 명확히 하라
한편으로는 ^J
암호 해독 문자의 형성을 금지하고 다른 한편으로는 추가됩니다.오직Windows 조합과 달리 LF
Linux에서는 복사된 데이터에 줄 바꿈( 문자)을 사용할 수 있습니다.CRLF
개별적으로 추가된 문자는 LF
붙여넣은 데이터가 하나의 긴 텍스트 줄로 표시되는 것을 방지하므로 좋습니다.
- 나 또한 원해WSL 개발팀.WSL 예Linux용 Windows 하위 시스템프로젝트.