No shell Korn, como no shell Bourne, aspas e backticks (a forma arcaica de substituição de comando) podem ser incomparáveis, e você precisa ajudar o tokeniser a dizer onde os backticks terminam. Dentro dos backticks há outro nível de processamento de barra invertida.
echo "'date"
funciona e é o mesmo que:
echo "'date'"
echo "$(date)"
E:
echo 'echo "foo'
funciona e é o mesmo que:
echo 'echo "foo"'
echo $(echo "foo")
Se você fizer isso:
grep "'date +"%b %d"'"
Isso é considerado como grep
word e "'date +"
(backticks não-abertos entre aspas duplas) concatenado com %b
e, em seguida, %d
concatenado com outros backstiques não fechados entre aspas duplas: "'"
. Então é como
grep "$(date +)"%b %d"$()"
(exceto que, por alguma razão, enquanto echo "''"
ou echo "$()"
não causaria um erro, em echo "'"
, o shell tentará executar um comando com um nome vazio (como se você tivesse escrito echo "$("")"
).
Então, aqui, você precisa usar a barra invertida para ajudar o analisador:
grep "'date +\"%b %d\"'"
Essas barras invertidas são realmente removidas. É date +"%b %d"
que está sendo avaliado pelo subshell na substituição do comando.
Aqui, como ksh
aceita cotações não fechadas, você também pode:
grep "'date +\"%b %d"
(não que eu recomendaria fazer isso).
É também assim que você pode obter os backstacks aninhados como:
echo "'echo \"\'echo \\"a b\\"\'\"'"
Um bom exemplo de porque ninguém raramente usa essa sintaxe e usa o formulário $(...)
newer (introduzido por ksh
no início dos anos 80):
echo "$(echo "$(echo "a b")")"
Agora, para o seu problema específico, parece que você deseja listar ABC.LOG*
arquivos no diretório atual que foi modificado pela última vez hoje. Para isso, você poderia fazer:
touch -t "$(date +%Y%m%d0000)" .start-of-day &&
find . ! -name . -prune -name 'ABC.LOG.*' \
-newer .start-of-day -type f -exec ls -lrtd {} + &&
rm -f .start-of-day