이 경우 중괄호 안의 매개변수가 확장되지 않는 이유는 무엇입니까?

이 경우 중괄호 안의 매개변수가 확장되지 않는 이유는 무엇입니까?

예를 들어 다음과 같이 중괄호 안에 일부 파일 이름을 확장하고 싶습니다.

$ ls
blue_texture  blue_waves  green_light
$ ls -m | tr -d ' \n'
blue_texture,blue_waves,green_light 
$ echo foo/bar/{`ls -m | tr -d ' \n'`}
foo/bar/{blue_texture,blue_waves,green_light}

지원 확장이 여기서 작동하지 않는 이유는 무엇입니까? 나는 이것이 다음과 같이 작동할 것으로 기대합니다:

$ echo foo/bar/{blue_texture,blue_waves,green_light}
foo/bar/blue_texture foo/bar/blue_waves foo/bar/green_light

답변1

이것이 작동하지 않는 이유는 bash버팀대 확장이 수행되기 때문입니다.앞으로명령 대체(배쉬 참조 매뉴얼이에 대한 정보가 있습니다). 버팀대 확장이 발생할 때까지 교체가 수행되지 않습니다.

이를 수행할 수 있는 유일한 방법은 을 사용하는 것입니다 eval.원하지 않는다이 경우 임의의 명령 실행을 허용하므로 이렇게 하십시오.

대신에 다른 방법을 찾아야 합니다. 그러면 원하는 결과가 생성됩니다.

for file in *; do
    printf '%s ' "foo/bar/$file"
done; echo

답변2

zsh 사용:

files=(*)
echo foo/bar/$^l

( ${^array}중괄호 확장 스타일의 배열 확장을 엽니다.)

또는:

echo ./*(:s:.:foo/bar:)

파일 이름 확장자에 과거 확장자 스타일 대체를 적용합니다.

어떤 껍질이라도

printf 'foo/bar/%s\n' *

또는:

set -- *
for i do
  set -- "$@" "foo/bar/$i"
  shift
done
echo "$@"

( echo대부분의 쉘에서는 얻은 인수에 대해 일부 변환이 수행되므로 임의 입력은 피하는 것이 가장 좋습니다.)

관련 정보