다음과 같은 간단한 파일을 사용하는 bash 함수를 만들려고 합니다.
sample.txt
start=22 Mar 2016 10:00
end=22 Mar 2016 12:09
...그리고 시작과 끝을 지정한 시간 범위 내에서 /usr/local에 설치한 파일을 찾습니다.
내가 원래 만든 함수는 다음과 같습니다.
function findInstalled () {
if [[ $# -ne 1 ]]; then
echo "[ERROR] Usage: findInstalled /path/to/file" ;
return 1;
fi
start=$( grep start $1 | cut -d'=' -f2 ) ;
end=$( grep end $1 | cut -d'=' -f2 ) ;
if [[ ! -z $start ]]; then
start="-newerct \"${start}\"" ;
fi
if [[ ! -z $end ]]; then
end="! -newerct \"${end}\"" ;
fi
echo find /usr/local $start $end -type f ;
find /usr/local $start $end -type f ;
}
..이 함수를 실행하면 다음과 같은 출력이 제공됩니다.
$ findInstalled /path/to/sample.txt
find /usr/local -newerct "22 Mar 2016 10:00" ! -newerct "22 Mar 2016 12:09" -type f
find: I cannot figure out how to interpret `"22' as a date or time
이 명령을 실제로 실행하면 오류가 발생합니다 ...cannot figure out how to interpret...
. 그러나 에코된 버전의 명령을 복사하여 붙여넣으면 성공적으로 실행됩니다. 문제가 무엇인지 아시나요? 나는 큰따옴표와 작은따옴표를 사용하거나 사용하지 않고 다양한 조합을 시도했지만 그 중 아무 것도 작동하지 않습니다.
비록 내가 원하는 방식은 아니지만 다음을 수행하여 작동하는 기능을 얻었습니다.
function findInstalled () {
if [[ $# -ne 1 ]]; then
echo "[ERROR] Usage: findInstalled /path/to/file"
return 1;
fi
start=$( grep start $1 | cut -d'=' -f2 ) ;
end=$( grep end $1 | cut -d'=' -f2 ) ;
find /usr/local -newerct "$start" ! -newerct "$end" -type f ;
}
그래서 이것을 사용하여 원래 목표를 성공적으로 달성했지만 원래 기능이 작동하지 않는 이유가 무엇인지, 아니면 가능한지 알고 싶습니다.
답변1
문제는 쉘이 행을 토큰으로 나누는 방법입니다. $start
까지 확장됩니다 -newerct "22 Mar 2016 10:00"
.그 다음에공백으로 단어를 나눕니다. 따라서 find
다음 매개변수가 전달됩니다: -newerct
, 등. 따라서 오류 메시지가 나타납니다 "22
. 상태:Mar
man bash
확장 순서는 중괄호 확장, 물결표 확장, 매개변수, 변수 및 산술 확장, 명령 대체(왼쪽에서 오른쪽으로 수행), 토큰화 및 경로 이름 확장입니다.
원하시는대로 가능할지 모르겠네요. 두 번째 스크립트는 더 읽기 쉽지만 변수가 비어 있지 않은지 확인해야 합니다. 아마도 다음과 같이 할 수 있을 것입니다:
find /usr/local ${start:+-newerct} "$start" ${end:+! -newerct} "$end" -type f ;