* sh 쉘에서 백틱 (즉, cmd)이 더 이상 사용되지 않습니까?


118

유닉스와 리눅스뿐만 아니라 Bash & Zsh와 같은 쉘과 관련하여 문구 "백틱은 더 이상 사용되지 않습니다"를 사용하는 다른 사이트 에서도이 의견을 여러 번 보았습니다.

이 진술은 참인가 거짓인가?


참조 도와 쉘 스크립트에 따옴표를 백업하지 않은 이유는 cd디렉토리에 이유의 예는 $(...)표기가 중첩 다시 따옴표보다 사용하기 쉽다.
Jonathan Leffler


1
최소한 하나의 유닉스 인 AIX는 백틱이 더 이상 사용되지 않는다고 문서화했습니다 . "backquote 구문은 ksh에 의해 허용되지만 X / Open Portability Guide Issue 4 및 POSIX 표준에서는 더 이상 사용되지 않는 것으로 간주됩니다. 이러한 표준은 이식 가능한 응용 프로그램이 $ (command) 구문을 사용하도록 권장합니다." ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.osdevice/…
Christopher 19

Mac 10.10의 "GNU bash, 버전 3.2.57 (1)-릴리즈 (x86_64-apple-darwin14)"와는 분명한 차이가 있습니다. matchingLines=$( grep -n '\$-PARAMETER' ... | ... )작동하고 작동 matchingLines= backtick the same stuff backtick하지 않습니다. (그것은 ... 내 스크립트 아니다)
데니스

답변:


126

"더 이상 사용되지 않음"이라는 두 가지 의미가 있습니다.

더 이상 사용되지 않음 : (주로 소프트웨어 기능으로) 사용할 수는 있지만 일반적으로 대체 되었기 때문에 더 이상 사용하지 않고 피하는 것이 좋습니다.

— 새로운 옥스포드 미국 사전

이 정의에 따라 백틱 더 이상 사용되지 않습니다.

더 이상 사용되지 않는 상태 기능이 나중에 제거 될 것임을 나타낼 수도 있습니다 .

위키 백과

이 정의에 따라 백틱은 더 이상 사용 되지 않습니다.

여전히 지원 :

쉘 명령 언어 , 특히 "2.6.3 명령 대체"섹션 에서 공개 그룹 사양을 인용하면 사양 이 진행되는 한 명령 대체, 백틱 ( `..cmd..`) 또는 달러 파렌 ( $(..cmd..))이 여전히 지원됨을 알 수 있습니다.

발췌

명령 대체는 명령 이름 대신 명령 출력을 대체 할 수있게합니다. 명령 대체는 명령이 다음과 같이 묶여있을 때 발생합니다.

          $(command)

          or (backquoted version):

          `command`

쉘은 서브 쉘 환경에서 명령을 실행하고 (쉘 실행 환경 참조) 명령 대체 (명령 텍스트와 엔 클로징 $()또는 백 따옴표)를 명령의 표준 출력으로 대체하여 하나 이상의 시퀀스를 제거 하여 명령 대체를 확장해야합니다. 대체 종료시 <newline> 문자 출력이 끝나기 전에 포함 된 <newline> 문자는 제거되지 않아야합니다. 그러나 IFS의 값과 인용에 따라 필드 구분 기호로 필드 구분 기호로 처리되어 제거 될 수 있습니다. 출력에 널 바이트가 포함되어 있으면 동작이 지정되지 않은 것입니다.

역 따옴표로 묶인 명령 대체 스타일에서 <backslash> 는 '$', ' \`'또는 <backslash> 뒤에 오는 경우를 제외하고 문자 그대로의 의미를 유지해야합니다 . 일치하는 역 따옴표에 대한 검색은 인용되지 않은 첫 번째 인용되지 않은 역 따옴표에 의해 충족되어야합니다. 이 검색 중에 이스케이프 처리되지 않은 역 따옴표가 쉘 주석, 여기 문서, 내장 된 명령 대체 $(command)형식 또는 인용 된 문자열 내에 있으면 정의되지 않은 결과가 발생합니다. " `...`"시퀀스 내에서 시작하지만 끝나지 않는 작은 따옴표 또는 큰 따옴표 문자열 은 정의되지 않은 결과를 생성합니다.

$(command)형식을 사용하면 여는 괄호 다음에 일치하는 닫는 괄호 뒤에있는 모든 문자가 명령을 구성합니다. 지정되지 않은 결과를 생성하는 리디렉션만으로 구성된 스크립트를 제외하고 유효한 쉘 스크립트를 명령에 사용할 수 있습니다.

그렇다면 왜 모든 사람들이 백틱이 더 이상 사용되지 않는다고 말합니까?

대부분의 유스 케이스 백틱 대신 달러 파 렌스 양식을 사용해야하기 때문입니다. (위의 첫 번째 의미에서 더 이상 사용되지 않습니다.) 가장 평판이 좋은 사이트 (U & L 포함)의 대부분은이 사이트 전체에서이 정보를 언급하기도하므로 이는 적절한 조언입니다. 이 조언은 쉘에서 백틱에 대한 지원을 제거하려는 존재하지 않는 계획과 혼동되어서는 안됩니다.

  • BashFAQ # 082-왜 $ (...)가`...`(백틱)보다 선호됩니까?

    발췌

    `...`가장 오래된 비 POSIX 호환 Bourne-Shell에 필요한 레거시 구문입니다. 항상 $(...)구문을 선호하는 몇 가지 이유가 있습니다.

    ...

  • Bash Hackers Wiki-더 이상 사용되지 않는 구문

    발췌

    이것은 이전 Bourne 호환 형식의 명령 대체 입니다. `COMMANDS`$(COMMANDS)구문은 모두 POSIX에 의해 지정되지만 후자는 스크립트에서 여전히 널리 사용되지만 후자가 매우 선호됩니다. 새로운 스타일의 명령 대체는 모든 최신 쉘 (및 일부)에 의해 광범위하게 구현됩니다. 백틱을 사용하는 유일한 이유는 실제 Bourne 쉘 (예 : Heirloom)과의 호환성 때문입니다. Backtick 명령 대체에는 중첩시 특수 이스케이프가 필요하며, 야생에서 발견 된 예는 자주 인용되지 않습니다. 참조 : 왜 $ (...)가`...`(백틱)보다 선호됩니까? .

  • POSIX 표준 이론적 근거

    발췌

    이러한 불일치 동작으로 인해 명령 대체를 중첩하거나 복잡한 스크립트를 임베드하려는 새 응용 프로그램에는 역 따옴표로 묶인 다양한 명령 대체를 권장하지 않습니다.

참고 : 위의 세 번째 발췌 부분은 계속해서 백틱이 작동하지 않지만 다음 단락부터 시작하여 새로운 달러 파 렌스 방법이 작동하는 몇 가지 상황을 보여줍니다.

또한 역 따옴표로 묶인 구문에는 포함 된 명령의 내용에 대한 기록 제한이 있습니다. 최신 "$ ()"양식은 모든 종류의 유효한 포함 된 스크립트를 처리 할 수 ​​있지만 역 따옴표로 묶인 양식은 역 따옴표를 포함하는 일부 유효한 스크립트를 처리 할 수 ​​없습니다.

해당 섹션을 계속 읽으면 실패는 백틱을 사용하여 실패하는 방법을 보여 주지만 강조 표시되지만 최신 달러 Parens 표기법을 사용하여 작동합니다.

결론

따라서 백틱 대신 달러 달러를 사용하는 것이 바람직하지만 실제로는 "계획된 시점에서 완전히 작동이 중지됩니다"와 같이 기술적으로 "더 이상 사용되지 않는"것을 사용하지 않는 것이 좋습니다.

이 모든 내용을 읽은 후에는 POSIX Bourne이 아닌 실제 원본 쉘과 특별히 호환 되지 않는 한 달러 지폐를 사용하는 것이 좋습니다 .


26
으로 의 의미를 대부분 사용되지 , I (당신은) 역 따옴표가 말할 것이다 있다 되지 않습니다. 주로 용어 질문입니다.
Stéphane Chazelas

4
@StephaneChazelas-합의! 나는 ppl에게 그것들이 더 이상 사용되지 않는다고 말하지만 백틱은 공식적으로 "더 이상 사용되지 않았다"는 점에서 가까운 장래에 어떤 쉘의 코드베이스에서 적극적으로 제거 될 것이라는 의미입니다. 적어도 내가 아는 것은 없습니다.
slm

3
내 해석은 역 따옴표가 기존 코드에서 너무 비싸서 공식적으로 사용되지 않기 때문에 순전히 지원된다는 것입니다. 새 코드에서 계속 사용한다는 주장을 들어 본 적이 없습니다.
chepner

3
@ slm 그래, 나는 당신이 그것을 얻을 것 같아요-나는 뽑아 통지하지 않았다. 서브 쉘을 계층화 할 때 약간 더 깨끗할 수 있다는 것 외에는 $( cmd `cmd`)약간 더 지저분하므로 $( cmd $(cmd))읽기가 더 쉽다 는 점을 제외하고는 이러한 것들을 사용할 이유가 거의 없습니다 . 나는 항상 소프트웨어에서 더 이상 사용되지 않는 기능을 업스트림에 의해 공식적으로 제거 된 것으로 간주했습니다. 그런 말은 들어 본 적이 없습니다. 상관 없어요-무덤에 대한 사랑이 없습니다.
mikeserv

3
POSIX 표준 이론적 근거 에서 다음 인용문을 추가 할 수 있습니다 . 이러한 불일치 동작으로 인해 명령 대체를 중첩하거나 복잡한 스크립트를 임베드하려는 새 응용 프로그램에는 역 따옴표로 묶인 다양한 명령 대체를 권장하지 않습니다. 이론적 근거가 유익하고 규범 적이 지 않기 때문에 공식적인 지원 중단은 아니지만 백틱의 지속적인 사용은 피해야한다고 제안합니다.
jw013

15

더 이상 사용되지 않지만 백틱 ( `...`)은 가장 오래된 비 POSIX 호환 bourne-shell에 필요한 레거시 구문 $(...)이며 POSIX이며 몇 가지 이유로 더 선호됩니다.

  • \백틱 내부의 백 슬래시 ( )는 명확하지 않은 방식으로 처리됩니다.

    $ echo "`echo \\a`" "$(echo \\a)"
    a \a
    $ echo "`echo \\\\a`" "$(echo \\\\a)"
    \a \\a
    # Note that this is true for *single quotes* too!
    $ foo=`echo '\\'`; bar=$(echo '\\'); echo "foo is $foo, bar is $bar" 
    foo is \, bar is \\
  • 중첩 된 인용문 $()이 훨씬 더 편리합니다.

    echo "x is $(sed ... <<<"$y")"

    대신에:

    echo "x is `sed ... <<<\"$y\"`"

    또는 다음과 같은 것을 작성하십시오.

    IPs_inna_string=`awk "/\`cat /etc/myname\`/"'{print $1}' /etc/hosts`

    $()인용을 위해 완전히 새로운 맥락을 사용 하기 때문에

    Bourne 및 Korn 쉘에는 이러한 백 슬래시가 필요하지만 Bash 및 대시는 필요하지 않으므로 이식성이 없습니다.

  • 중첩 명령 대체 구문이 더 쉽습니다.

    x=$(grep "$(dirname "$path")" file)

    보다:

    x=`grep "\`dirname \"$path\"\`" file`

    때문에이 $()인용에 대한 완전히 새로운 컨텍스트를 적용, 각각의 명령 치환은 보호되며 인용하고 탈출을 통해 특별한 문제없이 자체적으로 처리 할 수 있습니다. 백틱을 사용하는 경우 레벨이 2 이상이되면 배가 더 나빠집니다.

    몇 가지 더 많은 예 :

    echo `echo `ls``      # INCORRECT
    echo `echo \`ls\``    # CORRECT
    echo $(echo $(ls))    # CORRECT
  • 역 따옴표를 사용할 때 일관되지 않은 동작 문제를 해결합니다.

    • echo '\$x' 출력 \$x
    • echo `echo '\$x'` 출력 $x
    • echo $(echo '\$x') 출력 \$x
  • Backticks 구문에는 포함 된 명령의 내용에 대한 기록 제한이 있으며, 역 따옴표를 포함하는 일부 유효한 스크립트를 처리 할 수 ​​없지만 최신 $()양식은 모든 종류의 유효한 포함 된 스크립트를 처리 할 수 ​​있습니다.

    예를 들어, 유효한 다른 내장 스크립트는 왼쪽 열에서 작동하지 않지만 오른쪽 IEEE 에서는 작동합니다 .

    echo `                         echo $(
    cat <<\eof                     cat <<\eof
    a here-doc with `              a here-doc with )
    eof                            eof
    `                              )
    
    
    echo `                         echo $(
    echo abc # a comment with `    echo abc # a comment with )
    `                              )
    
    
    echo `                         echo $(
    echo '`'                       echo ')'
    `                              )

따라서 $-prefixed 명령 대체 구문 은 선호하는 방법이어야합니다. 깨끗한 구문으로 시각적으로 명확하고 (인간 및 기계 가독성 향상) 중첩 가능하고 직관적이며 내부 구문 분석이 분리되어 있으며보다 일관성이 있기 때문입니다. 큰 따옴표 내에서 구문 분석되는 다른 모든 확장) (예 : 백틱이 유일한 예외이고 `문자가 인접 해있을 때 문자가 쉽게 위장 "되어 특히 작거나 특이한 글꼴로 읽기가 더 어려워 짐)

출처 : $(...)선호하는 이유는 무엇입니까 `...`(백틱)? BashFAQ에서

또한보십시오:

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.