bash가 명령 대체의 텍스트를 이후의 텍스트로 바꾸는 이유는 무엇입니까?

bash가 명령 대체의 텍스트를 이후의 텍스트로 바꾸는 이유는 무엇입니까?

일부 nginx 구성을 구문 분석하려고 합니다.

λ tree sites-enabled/ sites-available/
sites-enabled/
├── bank.cwrcoding.com.conf
├── calendar.cwrcoding.com.conf
├── cloud.cwrcoding.com.conf
├── cwrcoding.com.conf
├── drive.cwrcoding.com.conf
├── groups.cwrcoding.com.conf
├── mail.cwrcoding.com.conf
├── sites.cwrcoding.com.conf
├── studentenverwaltung.cwrcoding.com.conf
├── wekan.cwrcoding.com.conf
└── www.cwrcoding.com.conf
sites-available/
├── bank.cwrcoding.com.conf
├── calendar.cwrcoding.com.conf
├── cloud.cwrcoding.com.conf
├── cwrcoding.com.conf
├── drive.cwrcoding.com.conf
├── groups.cwrcoding.com.conf
├── mail.cwrcoding.com.conf
├── sites.cwrcoding.com.conf
├── studentenverwaltung.cwrcoding.com.conf
├── wekan.cwrcoding.com.conf
└── www.cwrcoding.com.conf

site-enabled/* 파일에는 각각 한 줄이 포함되어 있습니다.

include sites-availabe/cwrcoding.com.conf;

사이트 활성화/* 파일을 반복하고 해당 파일을 잘라내어 해당 내용을 파일로 읽으려고 할 때 이상한 오류가 발생하여 최소한의 작업 솔루션을 시도하고 거기에서 작업했지만 다음은 여전히 ​​발생합니다.

λ for enabled in sites-enabled/*
> do
> echo "$(cat "$enabled") |"
> echo ==========
> done
include sites-available/bank.cwrcoding.com.conf; |
==========
 |clude sites-available/calendar.cwrcoding.com.conf;
==========
 |clude sites-available/cloud.cwrcoding.com.conf;
==========
 |clude sites-available/cwrcoding.com.conf;
==========
 |clude sites-available/drive.cwrcoding.com.conf;
==========
 |clude sites-available/groups.cwrcoding.com.conf;
==========
 |clude sites-available/mail.cwrcoding.com.conf;
==========
 |clude sites-available/sites.cwrcoding.com.conf;
==========
 |clude sites-available/studentenverwaltung.cwrcoding.com.conf;
==========
include sites-available/wekan.cwrcoding.com.conf; |
==========
 |clude sites-available/www.cwrcoding.com.conf;
==========

보시다시피 대부분의 웹사이트에서는고양이출력은 있어야 할 텍스트로 대체됩니다.뒤쪽에명령 대체.

무슨 일인지 설명해 줄 수 있는 사람 있나요? 아니면 버그를 발견한 걸까요?

이 파일을 보려면:https://github.com/cwrau/nginx-config

답변1

문제는 파일에 DOS/Windows 스타일 줄 끝이 있다는 것입니다. 빠른 해결 방법으로 다음을 교체하십시오.

echo "$(cat "$enabled") |"

그리고:

echo "$(tr -d '\r' <"$enabled") |"

여기서는 tr파일을 표시하기 전에 캐리지 리턴을 제거하면 문제를 피할 수 있습니다.

dos2unix그러나 파일이 Unix 시스템에서 사용되도록 만들어진 경우 하나 또는 유사한 유틸리티를 사용하여 파일 자체에서 캐리지 리턴을 제거하는 것이 더 나을 수 있습니다 .

두 개의 DOS 스타일 파일을 만들어 보겠습니다.

$ echo 'include sites-availabe/cwrcoding.com.conf;' | unix2dos > sites-enabled/file1
$ echo 'include sites-availabe/cwrcoding.com.conf;' | unix2dos > sites-enabled/file2

원래 명령을 실행해 보겠습니다.

$ for enabled in sites-enabled/*; do echo "$(cat "$enabled") |"; echo ==========; done
 |clude sites-availabe/cwrcoding.com.conf;
==========
 |clude sites-availabe/cwrcoding.com.conf;
==========

손상된 출력을 확인하십시오.

을 적용한 후 tr예상되는 출력을 받습니다.

$ for enabled in sites-enabled/*; do echo "$(tr -d '\r' <"$enabled") |"; echo ==========; done
include sites-availabe/cwrcoding.com.conf; |
==========
include sites-availabe/cwrcoding.com.conf; |
==========

관련 정보