특정 형식 문자열을 사용하는 printf 바로 가기 명령

특정 형식 문자열을 사용하는 printf 바로 가기 명령

printf특정 형식 문자열과 함께 바로 가기 명령을 사용하고 싶었고 다음을 생각해냈습니다.

local PF="printf %s\n"
$PF "Some Text"

작업을 수행하지만 이 접근 방식을 사용할 때 형식 문자열을 잘못 해석할 수 있는 주의 사항이 있는지 알고 싶습니다.

답변1

  1. 함수만 사용할 수 있는데 왜 변수 값을 실행해야 할까요? 그게 바로 함수의 목적입니다.

    PF() { printf "%s\n" "$@" ; }
    PF "Some Text"
    

    또는 별칭:

    alias PF='printf "%s\n"'
    PF "Some Text"
    
  2. 변수를 실제로 사용하려면 해당 변수를 사용하여 형식 문자열을 보관하세요. 예를 들어

    fmt="%s\n"
    printf "$fmt" "Some Text"
    

    줄 길이를 80자 미만으로 유지하려면 두 개 이상의 문에 변수를 할당할 수 있습니다. 예를 들어

    fmt="......part1......"
    fmt+="......part2......"
    fmt+="......part3......"
    ...
    

    이는 할당된 형식 문자열을 더 읽기 쉽게 만들거나 일부 또는 전체 섹션에 대해 별도의 설명을 추가하려는 경우에도 유용합니다.

답변2

목록 컨텍스트 에서 $PF분할+glob을 호출합니다 . 콘텐츠는 $PF특수 매개변수(예: 코드가 해석될 때 발생하는 것과 무관)를 포함하는 복잡한 규칙에 따라 분할되며 $IFS, 결과 단어는 파일 이름 생성(일명 경로 이름 확장, 일명 와일드카드)의 영향을 받습니다.bashprintf %s\n

따라서 여기에는 적어도 두 가지 문제가 있습니다.

  1. 의 동작은 의 $PF현재 값에 따라 달라집니다 $IFS. 기본적으로 에는 bash공백 $IFS, 탭 및 줄 바꿈이 포함되어 있습니다. 여기서는 공백으로 분할하고 싶습니다 $PF. 그렇지 않으면 문자열에 탭이나 줄 바꿈이 포함되지 않습니다. 그러나 예를 들어 $IFS변경된 컨텍스트 에서는 인수를 사용하여 명령을 %실행하게 됩니다 ."printf ""s\n"

  2. 일부 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의 훌륭한 답변수행하는 방법.

관련 정보