~에서https://unix.stackexchange.com/a/32227/674
큰따옴표를 사용하지 않는 것이 안전한 주요 위치는 다음과 같습니다.
- 할당에서: (그러나
foo=$bar
예를 들어 배열 할당 내에서는 큰따옴표가 필요합니다.)export "foo=$bar"
array=("$a" "$b")
$bar
이는 값을 할당할 때 큰따옴표가 필요하지 않다는 의미입니까foo=$bar
? 왜?export "foo=$bar"
예를 들어 배열 할당에 큰따옴표를 사용해야 하는 이유는 무엇입니까array=("$a" "$b")
?
감사해요.
답변1
foo=$bar
예안전한왜냐하면 그것은일, 스칼라 할당 구문을 사용하여 스칼라 변수에 값을 할당합니다. 그것은스칼라 컨텍스트, 하나의 값만 저장할 수 있으므로 $var
분할 또는 glob은 의미가 없습니다 $bar
. 확장으로 인해 여러 단어가 생성되는 경우 셸은 해당 단어를 $foo
.
다음을 사용하면 상황이 달라집니다.
foo=($bar)
배열 변수에 할당하는 위치입니다. 이것은 목록 컨텍스트입니다. 배열 요소에 여러 단어를 할당하고 있습니다. 분할+글로브가 발생합니다.
export
또한 일부 쉘에서는 // local
/ typeset
/ declare
와 같은 이중 특성에 유의하세요 readonly
(참조지역 변수 할당에는 따옴표가 필요합니까?)
당신은 다음을 알게 될 것입니다 :
foo=$bar
할당문으로 구문 분석됩니다.
"foo"=$bar
명령 을 실행해 보십시오 foo=content_of_bar
(bar의 내용이 분할+glob의 영향을 받음).
export
(and other local
/ typeset
...)가 키워드이자 내장 명령인 셸(최신 버전의 ksh, bash 및 zsh)에서는 다음 위치에서 찾을 수 있습니다.
export foo=$bar
export
것으로 간주된다핵심 단어foo=$bar
할당 으로서 $bar
분할+glob의 영향을 받지 않습니다. 하지만 export
고려를 멈추는 데는 많은 노력이 필요하지 않습니다.핵심 단어. 이 경우 이는 단순한 명령으로 처리되며 다른 명령에 대한 인수와 마찬가지로 Split+glob이 발생합니다.
키워드로 처리되는 경우에도 export
인수가 변수 할당처럼 보이지 않으면(위에 표시된 대로 "foo"=$bar
) 일반 인수로 처리되며 다시 분할+glob의 적용을 받습니다.
답변2
두 가지 질문에 답하려면 먼저 "보안"이 무엇인지 알아야 합니다. Bash에는 수많은 확장 기능이 있으며 모두 특정 순서로 발생합니다. 일반적으로 우리가 무언가가 "안전하다"고 말할 때, 원하지 않는 분사가 발생하지 않는다는 것을 의미합니다. 이런 의미에서:
"안전"합니다. 즉, 큰따옴표가 필요하지 않습니다. bash 매뉴얼을 인용하면 다음과 같습니다.
다음 형식의 명령문을 사용하여 변수를 할당할 수 있습니다.
name=[value]
값이 지정되지 않으면 변수에 빈 문자열이 할당됩니다. 모든 값은 통과됩니다물결표 확장, 매개변수 및 변수 확장, 명령 대체, 산술 확장 및 따옴표 제거(아래 확장 참조).
단어 분할은 수행되지 않습니다. 따라서 그런 점에서 이는 매우 안전하며 실행이 실패하거나 파일이 삭제되는 등
bar="rm asdf"; foo=$bar;
의 미친 상황이 발생하지 않습니다 . 그러나 무엇$foo
eval $foo
~ 할 것이다변수 확장이 발생합니다.foo="Tomatoes are $50"
foo
콘텐츠를 소유하게 됩니다Tomatoes are 0
. 이것은 당신이 원하는 것일 수도 있고 아닐 수도 있습니다.비슷한 방식으로 작동합니다.
foo="rm asdf"; export bar=$foo
파일이 삭제되지 않고 올바르게 구문 분석됩니다foo="rm asdf"; array=($foo)
. 배열의 경우 단어 분할은 실제로하다발생하므로array
will 의 첫 번째 요소는 입니다rm
.또한 이 두 가지 모두에서 다른 확장 기능도 얻을 수 있습니다. 또한 이 경우 단어 분할이 발생한다고 확신합니다
export
. 내보내기는 모든 단어를 인수로 받아들이고echo $foo
따옴표가 필요하지 않은 것과 유사하게 예상한 대로 구문 분석합니다.
이 모든 예 중에서 토큰화가 발생하고 구체적인 효과가 있기 때문에 배열 예가 가장 안전하지 않은 예라고 생각합니다. 따라서 이 경우에는 큰따옴표가 필요합니다.