행사 안내 도구 모음의 실행 오류 해결하기

LinuxBeginner
지금 연습하기

소개

OPEN CIRCLE 은 지역 예술 행사의 오후를 준비합니다. 환영 도구 모음은 Chloé Martín, 林雨, 佐藤葵, João Silva 가 포함된 전체 프로그램을 표시합니다. 정상 예제는 동작하지만 새 내보내기 사본은 동작하지 않습니다.

원본을 보존하며 별도 전달본을 복구합니다. 기본 터미널 사용 경험이면 충분합니다. 권한, 스크립트 첫 줄, 문자 인코딩을 구분합니다. 읽기 프로그램은 제공되며 Python 이나 범용 변환기를 작성하지 않습니다.

브라우저의 Terminal 을 사용하세요. 모든 번역에서 예제 데이터와 출력은 원래 언어를 유지합니다.

원본을 유지하며 실행 스크립트 복구하기

이 단계에서는 정상 도구 모음과 내보낸 파일을 비교하고 직접 실행할 수 있는 전달용 스크립트를 만듭니다. Terminal 을 사용하세요.

실제 결과부터 읽기

cd 는 작업 디렉터리를 바꿉니다. ./ 는 해당 디렉터리를 기준으로 파일을 실행한다는 뜻입니다. 슬래시가 있으면 셸은 명령 이름을 검색하지 않고 그 경로를 사용합니다. 제공된 정상 예제부터 실행하세요.

cd /home/labex/project/event
./sample/start.sh
OPEN CIRCLE | Afternoon

14:00 — Welcome / Chloé Martín
14:30 — 纸艺工坊 / 林雨
15:15 — 音の庭 / 佐藤葵
16:00 — Café & questions / João Silva

빈 구분 줄까지 모두 읽으세요. 이것은 화면 이미지나 성공 표시가 아니라 제공된 읽기 프로그램이 실제로 디코딩한 내용입니다. cat 은 텍스트를 출력합니다. 변환을 선택하기 전에 내보내기 기록을 읽으세요.

cat source/export-receipt.txt

기록에 따르면 start.sh 는 CRLF 줄 끝을 가진 UTF-8 이고 programme.txt 는 BOM 이 있는 UTF-16-LE 입니다. 다른 파일은 이미 LF 를 쓰는 UTF-8 입니다. 확장자로 인코딩을 판단할 수 없습니다.

권한과 인터프리터 진입점 구분하기

ls -l 은 권한을 보여 주며 x 는 실행 권한입니다. 스크립트 첫 줄인 shebang 은 #! 로 시작하며 인터프리터를 지정합니다. 직접 실행하려면 유효한 진입점과 권한이 모두 필요합니다. 내보낸 스크립트를 시도하세요. 여기서는 의도적으로 실패를 확인합니다.

ls -l source/start.sh
./source/start.sh

permission denied 가 예상됩니다. 텍스트를 고쳐도 권한이 생기지 않습니다. 반면 bash file 은 Bash 가 파일을 읽게 하므로 직접 실행과 shebang 을 우회합니다. 이 스크립트는 명령 뒤에 주석이 있어 마지막 CR 이 주석 안에 들어갑니다. 시도해 보세요.

bash source/start.sh

Cannot read programme.txt 와 UTF-8 디코딩 오류가 예상됩니다. 읽기 프로그램까지 도달했지만 데이터를 해석하지 못하는 별개의 실패입니다. 명시적 Bash 호출은 조사 증거일 뿐 직접 실행 준비가 끝났다는 증거는 아닙니다.

cp -a 는 파일 모드를 보존하며 디렉터리 내용을 복사합니다. /. 는 숨김 파일을 포함한 내용입니다. source/ 와 sample/ 을 그대로 두고 전달본을 만드세요. mkdir -p 는 디렉터리와 없는 상위 디렉터리를 만들며, 이미 있어도 성공합니다. chmod u+x 는 소유자(u)에게 실행 권한을 추가하고 다른 권한은 바꾸지 않습니다.

mkdir -p delivery
cp -a source/. delivery/
chmod u+x delivery/start.sh
./delivery/start.sh

직접 실행은 여전히 실패하며 bad interpreter: /bin/bash^M: no such file or directory 같은 오류가 납니다. 어떤 셸은 cannot execute: required file not found 를 표시합니다. 스크립트는 존재합니다. 문제는 인터프리터 경로 끝의 CR 바이트입니다. chmod 를 반복하지 마세요.

바이트를 확인하고 스크립트 줄 끝만 수정하기

LF 는 0a, CRLF 는 0d 0a 입니다. file 은 바이트 패턴으로 형식을 설명합니다. od -An -tx1 -N16 은 주소를 생략하고 처음 16바이트를 16진수로 보여 줍니다. 기록과 바이트를 함께 판단하세요. file 은 완벽한 인코딩 판별기가 아닙니다.

file source/start.sh source/programme.txt
od -An -tx1 -N16 source/start.sh

shebang 은 0d 0a 로 끝납니다. 줄 끝과 문자 인코딩은 서로 다른 속성이며 스크립트는 이미 UTF-8 입니다. Linux 프로그램은 CRLF 텍스트를 읽을 수 있습니다. 여기서 실패하는 것은 직접 실행할 때 사용하는 인터프리터 경로입니다.

sed 's/\r$//' 는 줄 끝의 CR 만 지웁니다. 작은따옴표는 표현식을 보존하며 $ 는 줄 끝입니다. > 는 표준 출력을 다른 파일에 쓰고 재시도할 때 덮어씁니다. 입력 파일로 출력하지 마세요. sed 가 읽기 전에 셸이 비워 버립니다. && 는 앞 명령이 성공했을 때만 다음 명령을 실행합니다. 그다음 mv 가 완성된 임시 파일 이름을 바꿉니다.

sed 's/\r$//' source/start.sh > delivery/start.tmp && mv delivery/start.tmp delivery/start.sh
chmod u+x delivery/start.sh
od -An -tx1 -N16 delivery/start.sh
./delivery/start.sh

shebang 은 이제 0a 로 끝납니다. 마지막 명령은 명시적 Bash 와 같은 Cannot read programme.txt 에 도달합니다. 데이터 경계까지 진행한 것이지 전체 도구 모음이 완성된 것은 아닙니다. 잘못했다면 source/start.sh 부터 다시 변환하고 실행 권한을 복원하세요. 원본은 편집하지 않습니다.

프로그램을 변환하고 독립 전달본 사용하기

이 단계에서는 선언된 UTF-16 원본을 디코딩하고 전체 텍스트를 보존한 뒤 다른 디렉터리에서 전달본을 사용합니다. Terminal 의 /home/labex/project/event 에서 계속하세요.

원본 인코딩 증거 사용하기

문자 인코딩은 문자를 바이트에 대응시킵니다. UTF-8 과 UTF-16 은 같은 이름을 다른 바이트로 표현합니다. UTF-16 처음의 BOM 은 바이트 순서를 나타냅니다. ff fe 는 리틀 엔디언, fe ff 는 빅 엔디언이며 둘 다 UTF-16 입니다. 여기서 BOM 은 유용한 증거이지 언제나 해로운 접두사가 아닙니다.

od -An -tx1 -N16 source/programme.txt

처음의 ff fe 는 기록의 UTF-16-LE 와 일치합니다. 읽기 프로그램의 공개 입력 규약은 BOM 없는 UTF-8 입니다. 텍스트의 CRLF 는 허용하지만 이 UTF-16 바이트를 UTF-8 로 디코딩할 수 없습니다. CR 삭제나 확장자 변경으로는 변환되지 않습니다.

iconv -f UTF-16 -t UTF-8 은 BOM 이 있는 UTF-16 을 디코딩한 뒤 UTF-8 로 인코딩합니다. -f 는 원본, -t 는 대상 형식이며 UTF-16 은 BOM 으로 바이트 순서를 선택합니다. 임시 파일에 저장하고 성공한 경우에만 최종 파일로 바꾸세요.

iconv -f UTF-16 -t UTF-8 source/programme.txt > delivery/programme.tmp && mv delivery/programme.tmp delivery/programme.txt
file delivery/programme.txt
od -An -tx1 -N16 delivery/programme.txt
cat delivery/programme.txt

첫 바이트는 이제 제목의 UTF-8 바이트이며 ff fe, fe ff, UTF-8 BOM ef bb bf 가 아닙니다. 예제와 모든 이름을 비교하세요. 비 ASCII 문자를 삭제하면 디코딩에 성공해도 행사 내용을 잃습니다.

iconv 오류가 나면 출력이 불완전할 수 있습니다. && 는 불완전한 파일로 교체하는 일을 막습니다. 선언된 원본 인코딩을 확인하고 변하지 않은 원본에서 다시 시도하세요. -c 나 //IGNORE 로 문자를 조용히 버리지 마세요. 이 수업은 온전하고 형식이 선언된 파일을 다루며 손상된 내보내기 파일의 추측이나 복구는 다루지 않습니다.

이미 정상인 파일 유지하기

about.sh 와 door-sign.txt 는 이미 올바르므로 변환할 필요가 없습니다. cmp 는 바이트를 비교하고 동일하면 출력 없이 성공합니다. 다음 두 비교 모두 아무것도 출력하지 않아야 합니다.

cmp source/about.sh delivery/about.sh
cmp source/door-sign.txt delivery/door-sign.txt
./delivery/about.sh
cat delivery/door-sign.txt

커뮤니티 예술 소개와 Bienvenue · 欢迎 · ようこそ 가 나옵니다. 변환은 증거와 입력 규약에 따른 결정이며 모든 파일에 필수적인 처리가 아닙니다.

전달하고 실제로 실행하기

실행 스크립트는 자신의 위치를 기준으로 reader.py 를 찾고 읽기 프로그램도 programme.txt 를 찾습니다. 관련 없는 디렉터리로 이동하여 절대 경로를 실행하세요. 쓸 수 있는 전달본은 작성자의 현재 디렉터리나 명시적 bash 우회에 의존하면 안 됩니다.

cd /tmp
/home/labex/project/event/delivery/start.sh

앞서 본 오후의 네 항목 전체가 원래 순서와 빈 구분 줄을 유지하며 나와야 합니다. 실제 전달 파일을 사용했습니다. Chloé Martín, 林雨, 佐藤葵, João Silva 를 확인하세요. 종료 상태 0만으로 텍스트 보존을 증명할 수 없습니다.

프로젝트로 돌아가세요.

cd /home/labex/project/event

재시도할 때는 source/ 에서 해당 파일을 다시 생성합니다. 변환된 UTF-8 출력을 iconv -f UTF-16 에 다시 넣으면 원본 형식을 잘못 선언하게 됩니다. 정상 파일을 보존하고 변경 후 직접 실행을 반복하세요. 다른 프로그램은 다른 인코딩이나 BOM 을 허용할 수도 있습니다. 이 조건은 이 도구 모음의 공개 입력 규약입니다.

요약

직접 실행 권한, shebang 줄 끝, 데이터 인코딩을 구분했습니다. 이름, 순서, 정상 파일을 보존하며 완전한 UTF-8 프로그램을 전달하고 실행했습니다. 독립 저녁 도전에서는 다른 원본 증거에 같은 방법을 적용합니다.