백틱 및 큰따옴표

백틱 및 큰따옴표

이 질문에 대해 오랫동안 생각해 왔지만 아직 확인하는 방법을 모르겠습니다.

이것은:

x=`command -v r2g`

이것과 동일:

x="$(command -v r2g)"

여전히 다음과 같습니다.

x=$(command -v r2g)

...후자라면 이 방법으로 해결해야 합니까?

x="`command -v r2g`"

답변1

모든 예는 명령 대체를 통한 변수 할당이므로 동일합니다. ~에 따르면자일스의답, 변수 할당 오른쪽에는 단어 분리가 발생하지 않으므로 참조가 필요하지 않습니다. 그럼 4개 모두 괜찮습니다.

그들이 독립적인 경우, 즉 직장에 있지 않은 경우에는 참조가 필요합니다. 역따옴표에 비해 이 형식 의 장점 $(...)은 따옴표가 여러 줄에 걸쳐 중첩되고 분할될 수 있다는 점입니다. 이것이 바로 현재 이 형식이 일반적으로 선호되는 이유입니다. 즉, 이 형식을 사용하여 단어 분리 및 파일 이름 글로빙으로부터 내부 및 외부 확장을 "$( echo "$var" )" 모두 보호 할 수 있습니다.$var$(...)

그림에서 알 수 있듯이POSIX 쉘 명령 언어사양에 따르면 포함된 여러 줄 스크립트는 백틱(왼쪽)을 사용할 수 없지만 $()형식(오른쪽)은 사용할 수 있습니다.

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 ')'
`                              )

답변2

이 네 가지 예는 기능적으로 동일합니다.

백틱은 더 이상 사용되지 않으며 Bourne 쉘(예: Heirloom)과 같은 1970년대 쉘을 사용하지 않는 한 필요하지 않습니다. 가장 큰 문제는 그들이둥지 짓기가 어렵다, 노력하다:

$ echo $(uname | $(echo cat))
Linux

$ echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat

할당이 하나만 있는 명령줄의 오른쪽에서는 확장을 인용하는 것이 불필요합니다(그러나 무해합니다). 확장은 어쨌든 인용된 것으로 간주되기 때문입니다.

$ var=$(uname)

하지만 그건아니요항상 true입니다. 명령 내보내기에 대한 할당은 인수로 처리되며 일부 쉘(bash가 아님)에서 분할 및 glob됩니다.

$ dash -c 'export MYVAR=`echo a test`;echo "$MYVAR"'
a

동일한 추론이 local(지역 변수 할당에는 따옴표가 필요합니까?) 및 declare(및 기타 몇 가지).

"수정"하기 위해 수행해야 할 작업은 다음과 같습니다.

x=$(command -v r2g)

때때로 (이식 가능한 스크립트의 경우):

export x="$(command -v r2g)"

답변3

예, 백틱도 인용되어야 합니다.

이는 명령 출력에 공백이 포함되지 않은 경우 선호하는 bash 스타일에 문제가 있을 수 있습니다. 다음은 이 유틸리티 작성자의 인용문입니다 shellharden.Bash에서 안전하게 작업하는 방법":

Should I use backticks?
Command substitutions also come in this form:

Correct: "`cmd`"
Bad: `cmd`
While it is possible to use this style correctly, it looks even more awkward in quotes and is less readable when nested. The consensus around this one is pretty clear: Avoid.

Shellharden rewrites these into the dollar-parenthesis form.

나는 또한 백틱을 인용 하거나 (더 나은) 사용하도록 다시 작성하는 것이 "좋은 형식이라고 생각합니다 $(). 백틱을 사용할 때 명령 출력에 공백이나 특수 문자가 포함되어 있는 경우 표현식을 인용하지 않으면 문제가 발생할 수 있습니다.

답변4

예, 이 문서에 따르면 내 추측은 정확해 보입니다. https://github.com/anordal/shellharden/blob/master/how_to_do_things_safely_in_bash.md

그것은 말한다:

# Should I use backticks?
# Command substitutions also come in this form:

Correct: "`cmd`"
Bad: `cmd`

관련 정보