예를 들어 공백이 포함된 파일 이름이 있다고 가정합니다 with space
. "공백 포함"을 인수로 허용하는 cmd
다음 코드 조각에서는 무엇을 출력해야 합니까 ?ls
$ ls `cmd`
나는 노력했다 ls `echo 'with space'`
. 에 전달된 매개변수는 및 ls
입니다 . 백슬래시를 사용하여 공백을 벗어나려고 해도 작동하지 않습니다. 나는 사용이 효과가 있음을 본다. 그러나 공백을 포함할 수 있는 일부 파일에 여러 파일을 인수로 전달하려는 경우에는 작동하지 않습니다 .'with
space'
ls "`cmd`"
ls
명령 대체에 대한 매뉴얼도 드물게 나타납니다.https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html
보다 일반적으로 cmd가 다른 명령에서 사용하기 위해 백틱 대체를 사용하여 대체할 수 있는 파일 목록을 출력하려는 경우 cmd가 따르는 출력 형식은 무엇입니까?
답변1
나는 사용이
ls "`cmd`"
효과가 있음을 본다. 그러나 여러 파일을 ls에 대한 인수로 전달하려는 경우에는 작동하지 않으며 그 중 일부에는 공백이 포함될 수 있습니다.
좋아요. 이는 명령을 변수에 저장하는 것과 동일한 문제입니다(이미 논의됨).예를 들어 여기), 정말 잘 할 수 없습니다. 생각나는 옵션은 다음과 같습니다.
cmd
NUL로 구분된 파일 이름 목록을 출력 하고xargs -0
이를 다른 명령으로 파이프합니다.IFS
어떤 파일명에도 나오지 않는 문자로 설정하고 ,cmd
이것으로 구분하여 파일 목록을 출력한다.- 출력은
cmd
셸에서 올바르게 인용한 다음eval
.
이와 같이:
$ touch "with space" "another space"
$ printf "%s\0" "with space" "another space" | xargs -0 ls -i
1705749 another space 1705230 with space
$ set -f; IFS=%; ls -i $(echo "with space%another space")
1705749 another space 1705230 with space
$ eval ls -i "$(echo '"with space" "another space"')"
1705749 another space 1705230 with space
find -exec ...
아니면 교체가 가능하다면 사용하세요 cmd
.