내보내기 문에서 Bash 중괄호 확장이 작동하지 않습니다.

내보내기 문에서 Bash 중괄호 확장이 작동하지 않습니다.

다음 예를 고려하십시오.

$ echo file_{a,b,c}
file_a file_b file_c         # brace expansion worked :)

$ export VARIABLE=file_{a,b,c}
$ echo $VARIABLE
file_c                       # brace expansion didn't work :(

직접 에코하면 중괄호 확장이 세 파일의 이름을 모두 인쇄 file_{a,b,c}하지만 동일한 표현식을 변수에 할당하고 에코하면 file_c의 이름만 인쇄하는 이유는 무엇입니까?

내 상황에 맞게 중괄호로 확장된 문자열을 변수에 할당하는 다른 방법이 있습니까?

답변1

실행 set -x하고 무슨 일이 일어나는지 확인하세요.

$ set -x
$ export VARIABLE=file_{a,b,c}
+ export VARIABLE=file_a VARIABLE=file_b VARIABLE=file_c
+ VARIABLE=file_a
+ VARIABLE=file_b
+ VARIABLE=file_c

결국 동일한 변수에 다른 값을 할당하게 되고, 각 값은 이전 값을 덮어쓰게 됩니다.

중괄호 확장은 "목록 컨텍스트"에서만 작동하므로 단일 문자열을 생성하는 데 사용하기 어려울 것이라고 생각합니다. 비슷한 것이 없다면 말이죠 string=$(echo file_{a,b,c}).

없이 동일한 작업을 수행하는 것과 동일합니다 export. 즉, VARIABLE=file_{a,b,c}확장되지 않은 값만 할당합니다 VARIABLE='file_{a,b,c}'. 하지만 그렇게 한다면 export VARIABLE=$foo,$foo아니요단어 분할을 수행합니다. export등 의 내장 함수 할당은 readonly약간 이상합니다. (이것은 Bash에 있습니다. 다른 쉘은 테스트하지 않았습니다.)

그러나 공백으로 구분된 문자열(실제로 원하는 경우)은 고유한 값을 저장하는 가장 좋은 방법이 아니라는 점에 유의하십시오. 주로 공백이 포함된 파일 이름을 저장할 수 없기 때문입니다.

가능하다면 수행 중인 작업에 따라 배열 사용을 고려할 수도 있습니다.

$ arr=( file_{a,b,c} )
$ echo "${arr[1]}"
file_b
$ printf "<%s>\n" "${arr[@]}"
<file_a>
<file_b>
<file_c>

관련 정보