명령줄 출력에서 ​​줄 바꿈을 인쇄하는 방법

놀랍게도 컴퓨터가 사람이 읽을 수 있는 출력을 제공하도록 하는 것은 쉬운 일이 아닙니다. standard streams 및 특히 표준 출력의 도입으로 프로그램은 일반 텍스트 스트림을 사용하여 서로 통신할 수 있는 방법을 얻었습니다. stdout을 인간화하고 표시하는 것은 또 다른 문제입니다. ASCII characters in video computer displays 사용에서 echoprintf 와 같은 최신 셸 명령에 이르기까지 컴퓨팅 시대의 기술은 이 문제를 해결하기 위해 노력했습니다.

이러한 발전은 매끄럽지 않았습니다. 터미널에 출력을 인쇄하는 작업은 escape sequence을 확장하여 줄 바꿈을 인쇄하는 기만적으로 중요한 작업에서 알 수 있듯이 프로그래머가 탐색해야 하는 문제로 가득 차 있습니다. 자리 표시자\n의 확장은 다양한 방법으로 수행할 수 있으며 각 방법에는 고유한 역사와 합병증이 있습니다.

에코 사용



Multics에 등장한 것부터 현대의 유닉스 계열 시스템 편재성에 이르기까지 echo는 터미널에서 "Hello world!"라고 말할 수 있는 친숙한 도구로 남아 있습니다. 불행하게도 운영 체제 전반에 걸쳐 일관되지 않은 구현으로 인해 사용이 까다로워집니다. 일부 시스템에서 echo가 이스케이프 시퀀스를 자동으로 확장하는 경우 others에는 동일한 작업을 수행하는 -e 옵션이 필요합니다.

echo "the study of European nerves is \neurology"
# the study of European nerves is \neurology
echo -e "the study of European nerves is \neurology"
# the study of European nerves is
# eurology

이러한 구현의 불일치로 인해 echo는 이식할 수 없는 것으로 간주됩니다. 또한 사용자 입력과 함께 사용하면 명령 대체를 사용하여shell injection attack 상대적으로 손상되기 쉽습니다.

최신 시스템에서는 여전히 사용하는 많은 프로그램과의 호환성을 제공하기 위해서만 유지됩니다. POSIX specification recommends 새 프로그램에서 printf의 사용.

printf 사용



4thEdition Unix 이후로 휴대용 printf command은 본질적으로 새롭고 더 나은 것echo이었습니다. format specifiers을 사용하여 입력을 인간화할 수 있습니다. 백슬래시 이스케이프 시퀀스를 해석하려면 %b 를 사용하십시오. 문자 시퀀스\n는 출력이 개행 문자로 끝나도록 합니다.

printf "%b\n" "Many females in Oble are \noblewomen"
# Many females in Oble are
# oblewomen
printf에는 echo를 훨씬 더 강력하게 대체할 수 있는 추가 옵션이 있지만 이 유틸리티는 완벽하지 않으며 uncontrolled format string 공격에 취약할 수 있습니다. 프로그래머가 다음을 확인하는 것이 중요합니다carefully handle user input.

변수에 개행 넣기



컴파일러 간의 이식성을 개선하기 위한 노력의 일환으로 ANSI C Standard은 1983년에 설립되었습니다.

이렇게 하면 해석된 줄 바꿈으로 인쇄되는 변수에 줄 바꿈이 있는 문자열을 저장할 수 있습니다. 변수를 설정한 다음 $'...'를 사용하여 printf로 호출하면 됩니다.

puns=$'\number\narrow\nether\nice'
printf "%b\n" "These words started with n but don't make $puns"
# These words started with n but don't make
# umber
# arrow
# ether
# ice

확장된 변수는 작은따옴표로 묶여 있으며 문자 그대로 $ 에 전달됩니다. 항상 그렇듯이 입력을 적절하게 처리하는 것이 중요합니다.

ANSI-C 인용 보너스 라운드: 쉘 매개변수 확장



escape sequences 을 설명하는 내 기사에서 의 마법을 다루었습니다. 하나의 확장(printf )을 사용하여 이스케이프 시퀀스를 해석할 수도 있습니다. ${parameter@operator}printf 지정자를 사용하여 문자열로 인쇄하고 %s 연산자는 변수의 이스케이프 시퀀스를 적절하게 확장합니다.

printf "%s\n" ${puns@E}
# umber
# arrow
# ether
# ice

배쉬와 중괄호 인간의 대화에 대한 끊임없는 도전



shell parameter expansion은 계속해서 프로그래머에게 골칫거리입니다. 언어와 셸이 특정 자리 표시자가 의미하는 바에 동의하는 것 외에도 올바른 이스케이프 시퀀스를 올바르게 사용하려면 세부 사항에 대한 안목이 필요합니다.

열악한 문자열 보간은 과 같은 보안 취약점을 도입할 뿐만 아니라 어리석은 모양의 출력으로 이어질 수 있습니다. 터미널의 다음 진화로 인해 이모티콘으로 대화할 수 있을 때까지 사람을 위해 출력물을 인쇄할 때 주의를 기울이는 것이 가장 좋습니다.

좋은 웹페이지 즐겨찾기