Estou tentando criar um script que mostre arquivos no diretório mais recentes do que aquele fornecido como argumento, mas parece que estou tendo um problema. Atualmente tenho:
for f in *; do
if [["$f" -nt "$1"]]; then
echo "$f"
fi
done
No entanto, isso continua me dando um erro de que os comandos não podem ser encontrados em referência aos arquivos que estão sendo iterados. Como posso corrigir os problemas com este script?
Responder1
Você precisa de espaços ao redor [[
e]]
for f in *; do
if [[ "$f" -nt "$1" ]]; then
echo "$f"
fi
done
Sem os espaços, você receberá uma série de erros de “comando não encontrado”. Isso ocorre porque o shell procura um comando pelo nome [["$f"
e não consegue encontrá-lo. O comando que você deseja executar é [[
.
Alternativa
Sem a necessidade de loop:
find . -maxdepth 1 -newer "$1"
Responder2
Você precisa de um espaço depois do [[
e outro antes do ]]
. Esta é uma transferência de [
, que é tradicionalmente um arquivo executável real ( /bin/[
, vinculado simbolicamente a /bin/test
) - você precisava de um espaço para forçá-lo a ser avaliado como [
com expression
argumentos em vez de [expression
.
Embora [[
seja uma palavra-chave bash, ela tem um requisito semelhante.
Também é geralmente recomendado usar compatível com POSIX [
em seus scripts sempre que possível. [[
não é padrão e, portanto, não funcionará em todos os shells POSIX.