인용 시 매개변수 무시

인용 시 매개변수 무시

3개의 파일이 있는 디렉터리 file1file2다음 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'"

작은따옴표 '는 큰따옴표로 묶이므로 "문자열의 일부로 간주됩니다. printfwith %q(in bash, kshand zsh)를 사용하여 다음을 확인할 수 있습니다.

$ printf '%q\n' "$Command"
ls -1 -I 'file1'

터미널에서 직접 실행하면 작은따옴표가 인용되지 않고 셸에서 제거됩니다.

관련 정보