Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

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

놀랍게도, 컴퓨터가 인간이 읽을 수 있는 출력을 제공하도록 하는 것은 쉬운 일이 아닙니다. 표준 스트림과 특히 표준 출력의 도입으로 프로그램은 일반 텍스트 스트림을 사용하여 서로 통신할 수 있는 방법을 얻었습니다. 그러나 stdout을 인간화하고 표시하는 것은 또 다른 문제입니다. 비디오 컴퓨터 디스플레이에서 ASCII 문자를 사용하는 것부터 echo와 같은 최신 쉘 명령에 이르기까지 컴퓨팅 시대 전반에 걸쳐 기술이 이 문제를 해결하려고 시도했습니다. 및 printf .

이러한 발전은 순조롭지 않았습니다. 터미널에 출력을 인쇄하는 작업은 개행을 인쇄하기 위해 이스케이프 시퀀스를 확장하는 믿을 수 없을 정도로 사소하지 않은 작업으로 예시된 것처럼 프로그래머가 탐색해야 하는 기이한 일들로 가득 차 있습니다. 자리 표시자 \n 확장 각각 고유한 역사와 복잡성을 지닌 다양한 방법으로 달성할 수 있습니다.

echo 사용

Multics의 등장부터 오늘날의 Unix와 유사한 시스템 유비쿼터스에 이르기까지 echo 터미널에서 "Hello world!"라고 말하기 위한 친숙한 도구로 남아 있습니다. 불행히도 운영 체제 전반에 걸쳐 일관되지 않은 구현으로 인해 사용이 까다로워집니다. echo 위치 일부 시스템에서는 자동으로 이스케이프 시퀀스를 확장하고 다른 시스템에서는 -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 휴대할 수 없는 것으로 간주됩니다. 또한 사용자 입력과 함께 사용하면 명령 대체를 사용한 쉘 주입 공격을 통해 비교적 쉽게 손상될 수 있습니다.

현대 시스템에서는 여전히 사용하는 많은 프로그램과의 호환성을 제공하기 위해서만 유지됩니다. POSIX 사양은 printf 사용을 권장합니다. 새로운 프로그램에서.

printf 사용

Unix 4판 이후로 이식 가능한 printf 명령은 본질적으로 새롭고 더 나은 echo였습니다. . 형식 지정자를 사용하여 입력을 인간화할 수 있습니다. 백슬래시 이스케이프 시퀀스를 해석하려면 %b를 사용하십시오. . 문자 시퀀스 \n 출력이 개행으로 끝나는지 확인:

printf "%b\n" "Many females in Oble are \noblewomen"
# Many females in Oble are 
# oblewomen

printf echo를 훨씬 더 강력하게 대체하는 추가 옵션이 있습니다. , 이 유틸리티는 완전하지 않으며 제어되지 않는 형식 문자열 공격에 취약할 수 있습니다. 프로그래머가 사용자 입력을 신중하게 처리하도록 하는 것이 중요합니다.

변수에 줄 바꿈 넣기

컴파일러 간의 이식성을 향상시키기 위한 노력의 일환으로 ANSI C 표준이 1983년에 제정되었습니다. ANSI-C 인용은 $'...' , 이스케이프 시퀀스는 표준에 따라 출력에서 ​​대체됩니다.

이것은 우리가 해석된 개행으로 인쇄된 변수에 개행이 있는 문자열을 저장할 수 있도록 합니다. 변수를 설정한 다음 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

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

보너스 라운드:쉘 매개변수 확장

Bash와 중괄호를 설명하는 기사에서 쉘 매개변수 확장의 마법을 다루었습니다. ${parameter@operator} 확장 하나를 사용할 수 있습니다. , 이스케이프 시퀀스도 해석합니다. printf를 사용합니다. 의 %s 문자열로 인쇄할 지정자 및 E 연산자는 변수의 이스케이프 시퀀스를 적절하게 확장합니다.

printf "%s\n" ${puns@E}

# umber
# arrow
# ether
# ice

인간으로 말하는 지속적인 도전

문자열 보간은 프로그래머에게 계속 어려운 문제입니다. 언어와 쉘이 특정 자리 표시자의 의미에 동의하도록 하는 것 외에도 올바른 이스케이프 시퀀스를 적절하게 사용하려면 세부 사항에 대한 안목이 필요합니다.

열악한 문자열 보간은 어리석은 결과를 초래할 뿐만 아니라 주입 공격과 같은 보안 취약점을 유발할 수 있습니다. 터미널의 다음 진화가 이모티콘으로 말하게 될 때까지 인간을 위한 출력물을 인쇄할 때 주의를 기울이는 것이 가장 좋습니다.