구성 가능한 디렉터리와 제외된 파일이 포함된 코드 검색 스크립트를 작성하려고 합니다. 스크립트의 주요 부분은 다음 줄입니다.
out=$(grep -TInr$C$W --color=always \
--exclude={translations} \
--exclude-dir={build,tmp} \
"$SEARCH")
$C
$W
대소문자를 구분하지 않고 정확한 단어 일치를 구성하기 위해 스크립트 매개변수로 설정된 변수 와 $SEARCH
검색 문자열이 될 나머지 매개변수만 포함됩니다. 그러나 특정 파일을 무시하는 구현은 아직 효율적이지 않습니다.
검색에서 파일을 제외하기 위해 ~/.codesearch_config
다음과 같은 파일을 사용해 보았습니다.
#!/bin/bash
if [[ $PWD == "$HOME/project"* ]]; then
exclude_directories={.git,build,tmp}
exclude_files={translations}
fi
물론 여기서의 아이디어는 현재 작업 디렉토리를 기반으로 특정 제외 세트가 로드된다는 것입니다. 하지만 스크립트에 다음을 추가하려고 하면 다음과 같습니다.
--exclude=$exclude_files
bash는 다음과 같이 전체 인수를 작은따옴표로 묶습니다( -x
디버그 옵션으로 테스트).
grep -TInrw --color=always '--exclude={translations}' '--exclude-dir={build,tmp}' search_term
내가 원하는 것은 확장입니다 --exclude-dir=build --exclude-dir=tmp
. 이러한 변수의 값을 $exclude_
명령에 수동으로 추가하면 문제는 매개 변수와 전역 변수 주위에 작은따옴표를 넣는 것입니다. 이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?
답변1
exclude-dir
제외를 위해 배열을 사용하고 -- 및 --exclude
옵션 으로 확장해 보세요 .
예를 들어 스크립트의 경우 ~/.codesearch_config
(아마도 기본 스크립트에서 가져온 것일까요?):
#! /bin/bash
# temporary array variables
declare -a __exclude_directories
declare -a __exclude_files
if [[ "$PWD" == "$HOME/project"* ]]; then
__exclude_directories=(.git build tmp)
__exclude_files=(translations)
elif [[ "$PWD" == "/some/where/else" ]]; then
__exclude_directories=(foo bar)
__exclude_files=(abc.txt def.txt xyz.txt)
fi
exclude_directories=''
exclude_files=''
for i in "${__exclude_directories[@]}" ; do
exclude_directories+=" --exclude-dir '$i'"
done
for i in "${__exclude_files[@]}" ; do
exclude_files+=" --exclude '$i'"
done
unset __exclude_directories
unset __exclude_files
# comment out or delete the next two lines after you've verified
# that the output is correct.
echo $exclude_directories
echo $exclude_files
나중에 다음과 같이 사용할 것입니다.
out=$(grep -TInr$C$W --color=always \
$exclude_files \
$exclude_directories \
"$SEARCH")
참고: 여기에서는 변수 주위에 따옴표가 없습니다 $exclude_*
. 그렇지 않으면 다음과 같이 처리됩니다.하나의--exclude
다중 및 매개변수 대신 매개변수를 각각 사용합니다 --exclude-dir
. 이는 변수를 원하지 않고 큰따옴표로 묶어서는 안 되는 매우 드문 경우 중 하나입니다(예: 하나 이상의 변수 내에서 명령줄을 구성하는 경우).
거의 모든 경우에는 습관적으로 변수를 큰따옴표로 묶어야 합니다.