와일드카드를 사용하여 Bash 함수에 전달된 공백이 포함된 파일 이름 처리

와일드카드를 사용하여 Bash 함수에 전달된 공백이 포함된 파일 이름 처리

와일드카드를 사용하여 파일 이름을 전달할 때 Bash 함수가 공백이 포함된 파일 이름을 올바르게 처리하도록 하려면 어떻게 해야 합니까?

$ touch a "a b" b
$ ls -1 *
a
a b
b

$ function foo { ls -1 $*; }
$ foo *
a
a
b
c

ls -1 *실행될 때와 동일한 결과를 반환하는 foo 함수를 정의하고 싶습니다 foo *. $@대신 시도해 보았지만 $*역시 효과가 없었습니다.

답변1

함수가 호출되는 방식을 고려하면 함수가 무엇을 해야 하는지 잘 모르겠습니다. 그러나 이것은 가능한 해결책입니다.

foo () { ls -1 "$@"; }

함수는 ls -1명령에 전달된 함수 위치 인수를 사용하여 호출되어야 합니다. 어떻게 작동하나요?

$ touch a "a b" b
$ ls -1 .
a
a b
b
$ foo .
a
a b
b

이것은 또한 작동합니다:

$ foo *
a
a b
b

foo .하지만 의 차이점을 알아야 합니다 foo *. 전자는 .함수에 인수로 전달된 foo다음 동일한 인수가 내부적으로 전달됩니다 ls -1. 함수로 확장된 인수 목록을 내부적으로 처리해야 하기 foo *때문에 상황이 다릅니다 . 이는 공백을 처리하기 위해 위치 매개변수를 확장하는 내 함수에서 수행됩니다 . 주변 참조를 생략하면 다음과 같이 끝납니다.*foo"$@"$@

$ goo () { ls -1 $@; }
$ goo .
a
a b
b
$ goo *
a
a
b
b

"$*"마지막으로 "$@"로 차이점을 분석할 수 있습니다.

$ hoo () { ls -1 "$*"; }
$ hoo .
a
a b
b
$ hoo *
ls: cannot access 'a a b b': No such file or directory

여기서 "$*"는 확실히 올바르지 않습니다.

$ foo . .
.:
a
a b
b

.:
a
a b
b
$ hoo . .
ls: cannot access '. .': No such file or directory

관련 정보