변수에 저장된 -newerct 값을 사용할 때 오류 찾기

변수에 저장된 -newerct 값을 사용할 때 오류 찾기

다음과 같은 간단한 파일을 사용하는 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. 상태:Marman bash

확장 순서는 중괄호 확장, 물결표 확장, 매개변수, 변수 및 산술 확장, 명령 대체(왼쪽에서 오른쪽으로 수행), 토큰화 및 경로 이름 확장입니다.

원하시는대로 가능할지 모르겠네요. 두 번째 스크립트는 더 읽기 쉽지만 변수가 비어 있지 않은지 확인해야 합니다. 아마도 다음과 같이 할 수 있을 것입니다:

find /usr/local ${start:+-newerct} "$start" ${end:+! -newerct} "$end" -type f ;

관련 정보