Erro ao localizar ao usar valores -newerct armazenados em variáveis

1

Estou tentando criar uma função bash que usará um arquivo simples, como

sample.txt

start=22 Mar 2016 10:00
end=22 Mar 2016 12:09

... e localize os arquivos que eu instalei em / usr / local dentro do intervalo de tempo especificado por início e fim.

A função que criei originalmente é:

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 ;
}

.. e executar a função fornece a seguinte saída:

$ 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

A execução real do comando dá o erro ...cannot figure out how to interpret... . No entanto, se eu copiar e colar a versão ecoada do comando, ela será executada com êxito. Alguma idéia do problema? Note, eu tentei - e sem - todos os tipos de combinações diferentes de qoutes duplos e qoutes únicos e nenhum deles funcionou.

Eu consegui que a função funcione, embora não da maneira que eu queria, fazendo o seguinte:

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 ;
}

Então, usando isso, consegui atingir meu objetivo original, mas estou louca para descobrir por que minha função original não funciona ou se é possível.

    
por zhdason 22.03.2016 / 21:32

1 resposta

1

O problema é como o shell quebra a linha em tokens. Ele expande $start para -newerct "22 Mar 2016 10:00" , e então divide palavras em espaços. Assim, find recebe os seguintes argumentos: -newerct , "22 , Mar , etc., portanto, a mensagem de erro. man bash states:

The order of expansions is: brace expansion, tilde expansion, parameter, variable and arithmetic expansion and command substitution (done in a left-to-right fashion), word splitting, and pathname expansion.

Não tenho certeza se isso pode ser feito da maneira que você queria. Seu segundo script é mais legível, mas você precisa garantir que as variáveis não sejam nulas. Talvez você possa fazer assim:

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

    
por 22.03.2016 / 22:20