Este comando, quando executado sozinho, produz o resultado esperado (a última linha do crontab):
tail -n 1 /etc/crontab
No entanto, quando eu o executo como parte de um comando de eco para enviar o resultado para um arquivo, ele adiciona um resumo de todos os arquivos no diretório ativo, além do resultado esperado:
sudo bash -c 'echo $(tail -n 1 /etc/crontab) > /path/to/file'
Por que esse comando produziu os dados extras?
echo
fazendo por você aqui? Considere tambémtail -n 1 /etc/crontab | sudo tee /path/to/file >/dev/null
echo $(stuff)
?Respostas:
Sua linha do crontab possui um ou mais asteriscos
*
, indicando "a qualquer momento". Quando essa linha é substituída na substituição de comando, o resultado é algo comoEnquanto a maioria das expansões adicionais não é aplicada à saída da substituição de comando, a expansão do nome do caminho é (como é a divisão do campo) :
A expansão do nome do caminho é o que se transforma
*.txt
em uma lista de nomes de arquivos correspondentes (globbing), onde*
corresponde a tudo. O resultado final é que você obtém todos os nomes de arquivos (não ocultos) no diretório de trabalho listados para todos os*
itens da sua linha crontab.Você pode corrigir isso citando a expansão, se o código publicado for um representante de um comando mais complexo:
mas, mais diretamente, apenas perco
echo
completamente:Isso deve fazer o que você deseja e também é mais simples (a única outra diferença material é que esta versão omitirá a divisão de campos que, de outra forma, teria ocorrido, para que a execução de espaços não seja recolhida).
fonte
tail -n -1 /etc/crontab | sudo tee /path/to/file
é o idioma que eu achei menos propenso a erros ao redirecionar a saída para arquivos que exigem privilégios de superusuário.Vamos considerar um diretório com esses arquivos:
Agora, vamos executar o comando tail:
A descrição acima é a última linha de
crontab
e é isso que esperamos. Contudo:Aspas duplas eliminam esse problema:
Sem as aspas duplas, o resultado da substituição do comando é expandido pelo shell. Uma das expansões é a expansão do nome do caminho . No caso acima, isso significa que
f*
é expandido para corresponder a todos os nomes de arquivos que começam comf
.A menos que você queira explicitamente expansões de shell, coloque todas as variáveis de shell e / ou substituições de comandos entre aspas duplas.
fonte
O mecanismo do shell globing será expandido
*
para o arquivo local.a linha crontab provavelmente terá um
*
espaço reservado para qualquer.por exemplo, esta linha no crontab é executada às 7h07 no domingo, a primeira estrela significa qualquer dia, a segunda a cada mês.
então você
tail
e emitaque será expandido
*
para o arquivo local.fonte