Bash에서 대괄호로 묶인 문자열을 에코하면 "b"가 반환됩니다.

Bash에서 대괄호로 묶인 문자열을 에코하면 "b"가 반환됩니다.
$ a='"apple","ball","cat"'
$ a='['$a
$ echo $a
["apple","ball","cat"
$ a=$a']'
$ echo $a
b

b결과를 기대하고 있었는데 결과가 나와서 당황스럽네요 ["apple,"ball","cat"]. 내가 여기서 무엇을 놓치고 있는 걸까요?

이것은 bashMac의 쉘에서 가져온 것입니다. CentOS 7에서도 볼 수 있지만 Fedora에서는 볼 수 없습니다. 누군가 이것을 설명할 수 있나요?

답변1

b현재 디렉터리에 같은 이름의 파일이 있습니다.

[...]

패턴 일치 표현식입니다. [이름이 및 사이에 단일 문자로 구성된 모든 파일 과 일치합니다 ].

*이는 값에 따옴표 없이 변수를 사용하는 것과 유사합니다 .

답변2

Hauke는 왜 이런 일이 발생하는지 대답했습니다. 나중에 참고할 수 있도록 다음 방법으로 문제를 해결할 수도 있습니다 strace.

$ touch a b l
$ a='["apple","ball"]'                                                      
$ strace -e trace=execve echo $a
execve("/bin/echo", ["echo", "a", "b", "l"], [/* 82 vars */]) = 0
a b l
+++ exited with 0 +++

또는 다음을 사용하여 set -x:

$ set -x; echo $a
+ set -x
+ echo a b l
a b l

즉시 명확하지 않을 수도 있지만 적어도 셸이 인용되지 않은 변수를 항목 목록으로 변환한 것을 보면 파일 이름 확장이 발생했음을 추론할 수 있습니다.

관련 정보