Votre ligne crontab contient un ou plusieurs astérisques *
indiquant "à tout moment". Lorsque cette ligne est substituée à partir de la substitution de commande, le résultat est quelque chose comme
echo * * * * * cmd > /path/to/file
Bien que la plupart des extensions supplémentaires ne soient pas appliquées à la sortie de la substitution de commandes, l' expansion du nom de chemin est (tout comme la division des champs) :
Les résultats de la substitution de commande ne doivent pas être traités pour une expansion supplémentaire du tilde, une expansion de paramètre, une substitution de commande ou une expansion arithmétique. Si une substitution de commande se produit à l'intérieur de guillemets doubles, le fractionnement de champ et l' expansion de nom de chemin ne doivent pas être effectués sur les résultats de la substitution.
L'expansion du nom de chemin est ce qui se transforme *.txt
en une liste de noms de fichiers correspondants (globbing), où *
correspond tout. Le résultat final est que vous obtenez chaque nom de fichier (non masqué) dans le répertoire de travail répertorié pour chacun *
dans votre ligne crontab.
Vous pouvez résoudre ce problème en citant l'extension, si le code que vous avez publié était représentatif d'une commande plus complexe:
sudo bash -c 'echo "$(tail -n 1 /etc/crontab)" > /path/to/file'
mais plus simplement, il suffit de perdre echo
entièrement:
sudo bash -c 'tail -n 1 /etc/crontab > /path/to/file'
Cela devrait faire ce que vous voulez et c'est aussi plus simple (la seule autre différence matérielle est que cette version omettra le fractionnement de champ qui aurait autrement eu lieu, donc les séries d'espaces ne seront pas réduites).