この質問について長い間考えてきましたが、まだ確認する方法がわかりません。
これは:
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`