
printf
특정 형식 문자열과 함께 바로 가기 명령을 사용하고 싶었고 다음을 생각해냈습니다.
local PF="printf %s\n"
$PF "Some Text"
작업을 수행하지만 이 접근 방식을 사용할 때 형식 문자열을 잘못 해석할 수 있는 주의 사항이 있는지 알고 싶습니다.
답변1
함수만 사용할 수 있는데 왜 변수 값을 실행해야 할까요? 그게 바로 함수의 목적입니다.
PF() { printf "%s\n" "$@" ; } PF "Some Text"
또는 별칭:
alias PF='printf "%s\n"' PF "Some Text"
변수를 실제로 사용하려면 해당 변수를 사용하여 형식 문자열을 보관하세요. 예를 들어
fmt="%s\n" printf "$fmt" "Some Text"
줄 길이를 80자 미만으로 유지하려면 두 개 이상의 문에 변수를 할당할 수 있습니다. 예를 들어
fmt="......part1......" fmt+="......part2......" fmt+="......part3......" ...
이는 할당된 형식 문자열을 더 읽기 쉽게 만들거나 일부 또는 전체 섹션에 대해 별도의 설명을 추가하려는 경우에도 유용합니다.
답변2
목록 컨텍스트 에서 $PF
분할+glob을 호출합니다 . 콘텐츠는 $PF
특수 매개변수(예: 코드가 해석될 때 발생하는 것과 무관)를 포함하는 복잡한 규칙에 따라 분할되며 $IFS
, 결과 단어는 파일 이름 생성(일명 경로 이름 확장, 일명 와일드카드)의 영향을 받습니다.bash
printf %s\n
따라서 여기에는 적어도 두 가지 문제가 있습니다.
의 동작은 의
$PF
현재 값에 따라 달라집니다$IFS
. 기본적으로 에는bash
공백$IFS
, 탭 및 줄 바꿈이 포함되어 있습니다. 여기서는 공백으로 분할하고 싶습니다$PF
. 그렇지 않으면 문자열에 탭이나 줄 바꿈이 포함되지 않습니다. 그러나 예를 들어$IFS
변경된 컨텍스트 에서는 인수를 사용하여 명령을%
실행하게 됩니다 ."printf "
"s\n"
일부 bash 버전(예: 5.0, 5.1에서 복원된 것으로 생각됩니다)에서는
\
와일드카드입니다(적어도 여기에서는 일부 매개변수 확장에서 비롯되었으며 인용에 사용되지 않습니다).개방형
failglob
또는nullglob
옵션은 다음을 의미합니다.$ PF='printf %s\n' bash-5.0 -O failglob -c '$PF test' bash-5.0: no match: %s\n $ PF='printf %s\n' bash-5.0 -O nullglob -c '$PF test%d' test0
이러한 옵션이 없더라도:
$ PF='printf %s\n' bash-5.0 -c '$PF test' test $ touch %sn $ PF='printf %s\n' bash-5.0 -c '$PF test' testn
바라보다@cas의 훌륭한 답변수행하는 방법.