![와일드카드를 사용하여 Bash 함수에 전달된 공백이 포함된 파일 이름 처리](https://linux55.com/image/144467/%EC%99%80%EC%9D%BC%EB%93%9C%EC%B9%B4%EB%93%9C%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20Bash%20%ED%95%A8%EC%88%98%EC%97%90%20%EC%A0%84%EB%8B%AC%EB%90%9C%20%EA%B3%B5%EB%B0%B1%EC%9D%B4%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%20%EC%B2%98%EB%A6%AC.png)
와일드카드를 사용하여 파일 이름을 전달할 때 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