냉소적 인 추가 읽기

냉소적 인 추가 읽기

예를 들어 \c서식이 작동하지 않습니다. 이것을 bash 콘솔에 입력했는데 printf "ABC\ctest"결과는 다음과 같습니다.

ABC\ctest

\c형식의 속성을 고려할 때 예상되는 출력은 입니다 ABC.

또한 bash에서 printf 명령 사용을 자세히 설명하는 올바른 소스를 찾지 못했습니다. 또한 위의 예에 표시된 것처럼 printf 명령에 대해 지정된 매뉴얼 페이지의 속성이 올바르게 작동하지 않습니다.

printf 명령을 자세히 설명하는 bash 소스 코드를 보여주세요. 왜냐면 난 지금 혼란스러워요.

답변1

printf 'ABC\ctest'

명령의 지정되지 않은 부분 중 하나를 발견했는데 printf, 그 동작은 구현마다 다릅니다. 당신은 그것을 \c잘못된 장소에 넣었습니다.

당신이 읽었다면이것단일 유닉스 사양설명printf\c주의 깊게 살펴보면 형식 문자열(명령의 첫 번째 인수)에 대해 정의된 이스케이프 시퀀스 목록에 이 나열되어 있지 않다는 것을 알 수 있습니다 . 대신에 다음과 같이 정의됩니다.추가의주어지면 인식되는 이스케이프 시퀀스매개변수 문자열에서그냥 포맷하면 됩니다.%b형식 지정자를 통해.

다시 말해서:

  • printf '%b\n' 'ABC\ctest'분명한 행동이 있습니다. 이로 인해 \c형식 문자열의 줄 바꿈을 포함하여 나머지 모든 항목이 무시됩니다.
  • printf '%s\n' 'ABC\ctest'분명한 행동이 있습니다. \c우선 이것은 이스케이프 시퀀스가 ​​아닙니다.
  • printf '\c'명확하게 지정된 동작이 없습니다. 이것스테인레스 스틸실제로 무슨 일이 일어나고 있는지에 대해서는 침묵하고 \c, 이스케이프 시퀀스로 나열하거나 내용에 명시하지 않습니다.파일 형식 표기이러한 시퀀스 중 일부는 이스케이프 시퀀스가 ​​아닙니다.

이러한 형식화되지 않은 문자열에 대한 다양한 쉘의 동작은 매우 다양합니다. 다음은 Debian Almquist, Bourne Again, FreeBSD Almquist, Korn '93 및 Z shell' 반응입니다(여기서 %s는 줄바꿈이 발생하지 않는 위치를 나타냅니다).

%대시 -c "printf'ABC\ctest\n'"
ABC\ctest
%bash -c "printf 'ABC\ctest\n'"
ABC\ctest
%sh -c "printf 'ABC\ctest\n'"
알파벳%
%ksh93 -c "printf 'ABC\ctest\n'"
ABCest
%zsh -c "printf 'ABC\ctest\n'"
알파벳%
%

printf내 버전의 MirBSD Korn 및 PD Korn 쉘에는 내장 명령이 없습니다 . 내장되지 않은 FreeBSD는 printf다음을 수행합니다:

%/usr/bin/printf 'ABC\ctest\n'
알파벳%
%

더 흥미로운 점은 다양한 쉘의 문서가 때로는 매우 오해의 소지가 있고 때로는 완전히 틀린 경우도 있다는 것입니다. 몇 가지 예:

  • Z 쉘 도코\c최근에야 그 의미에 대한 적절한 설명을 제공 하고 echo형식 문자열에서 허용되는 이스케이프 시퀀스로 (doco for 를 통해) 나열하기 시작했습니다 . (이건 틀렸어2017년까지, doco도 동의하지 않습니다스테인레스 스틸Z 쉘이 실제로 무엇을 하는지에 대한 설명도 없습니다. )
  • Korn '93 shell doco match에서 제공한 설명스테인레스 스틸\c, 그러나 이는 (위에 표시된 대로) 형식 지정자에서 실제로 수행되는 작업이 아닙니다 . 또한 \c형식 문자열에 대한 이스케이프 시퀀스로 문서화되어 있습니다. 그 동작은 분명히 버그입니다.
  • Bourne Again 쉘 도코그리고데비안 Almquist 쉘 doco\c경기에 대한 설명을 해주세요스테인레스 스틸명시적으로 나열합니다 %b(Bourne Again 쉘의 경우 지금보다 더 명확합니다).2016년 기준) 그리고아니요printf형식 지정자에 대한 이스케이프 시퀀스의 일반 목록입니다. 이러한 쉘은 이 확장을 표준으로 제공하지 않습니다.
  • FreeBSD Almquist 쉘 docoFreeBSD 외부 printf명령 매뉴얼을 참조하세요. 설명은 \c다음을 따릅니다.스테인레스 스틸. 형식 문자열에 허용되는 이스케이프 시퀀스로 명시적으로 나열되며 실제 동작은 사용자 설명서에 설명되어 있습니다.

FreeBSD Almquist 쉘과 (최근) Z 쉘은 두 문서 모두 \c형식 문자열(표준 정의 확장)에서 이스케이프 시퀀스로 허용하는 유일한 쉘입니다.그리고실제로 문서화된 대로 수행하십시오.

냉소적 인 추가 읽기

답변2

해당 매개변수에서 백슬래시 이스케이프 시퀀스를 확장해야 합니다. 에서 언급했듯이여기:

\c  Terminate output similarly to the \c escape used by echo -e. printf produces no additional output after coming across a \c escape in a %b argument.
$ printf "%b\n" "ABC\chi"
ABC

관련 정보