3개의 파일이 있는 디렉터리 file1
와 file2
다음 bash 스크립트가 있습니다.
#!/bin/bash
set -e
Command="ls -1 -I file1"
echo "Command: $Command"
Files=`$Command`
echo "Files:"
echo $Files
결과는 예상했던 대로였다. 즉, file1
무시되고 목록에 표시되지 않습니다.
$ ./test.sh
Command: ls -1 -I file1
Files:
file2
test.sh
이제 이름에 공백이 있는 파일을 무시하도록 지원하려면 어떻게 해야 합니까? 파일 이름을 따옴표로 묶어야겠죠? 훌륭한...
#!/bin/bash
set -e
Command="ls -1 -I 'file1'"
echo "Command: $Command"
Files=`$Command`
echo "Files:"
echo $Files
생산하다:
$ ./test.sh
Command: ls -1 -I 'file1'
Files:
file1
file2
test.sh
그러나 Bash에서 동일한 명령을 직접 평가하면 올바른 결과가 생성됩니다.
$ ls -1 -I 'file1'
file2
test.sh
여기서 무슨 일이 일어나고 있는 걸까요? 따옴표를 추가하면 뭔가 탈선하는 것 같지만 왜 그럴까요?
명령을 다음과 같은 것으로 바꾸면 도움이 되지 않습니다.
Command="ls -1 -I \"file1\""
Command="ls -1 --ignore='file1'"
명령 평가를 변경해도 도움이 되지 않습니다.
Files=$($Command)
Files=$(`echo $Command`)
올바른 동작은 도입을 통해서만 달성될 수 있는 것 같습니다.eval
Files=$(eval $Command)
Files=`eval $Command`
왜 그것이 평가되고 실행되는지 이해하고 싶지만 ls
인용된 매개변수는 추가되지 않으면 무시됩니다.eval
답변1
왜냐하면견적 삭제인용 문자 자체가 인용된 경우 인용 문자에는 적용되지 않습니다.
존재하다:
Command="ls -1 -I 'file1'"
작은따옴표 '
는 큰따옴표로 묶이므로 "
문자열의 일부로 간주됩니다. printf
with %q
(in bash
, ksh
and zsh
)를 사용하여 다음을 확인할 수 있습니다.
$ printf '%q\n' "$Command"
ls -1 -I 'file1'
터미널에서 직접 실행하면 작은따옴표가 인용되지 않고 셸에서 제거됩니다.