와일드카드를 사용하여 파일 이름을 전달할 때 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