예를 들어 다음과 같이 중괄호 안에 일부 파일 이름을 확장하고 싶습니다.
$ 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
대부분의 쉘에서는 얻은 인수에 대해 일부 변환이 수행되므로 임의 입력은 피하는 것이 가장 좋습니다.)