Cette commande, lorsqu'elle est exécutée seule, produit le résultat attendu (la dernière ligne de la crontab):
tail -n 1 /etc/crontab
Cependant, lorsque je l'exécute dans le cadre d'une commande echo pour envoyer le résultat à un fichier, il ajoute un résumé de tous les fichiers du répertoire de travail, plus le résultat attendu:
sudo bash -c 'echo $(tail -n 1 /etc/crontab) > /path/to/file'
Pourquoi cette commande a-t-elle produit les données supplémentaires?
echo
fais-tu ici? Pensez aussitail -n 1 /etc/crontab | sudo tee /path/to/file >/dev/null
echo $(stuff)
?Réponses:
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 commeBien 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) :
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:
mais plus simplement, il suffit de perdre
echo
entièrement: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).
la source
tail -n -1 /etc/crontab | sudo tee /path/to/file
c'est l'idiome que j'ai trouvé le moins sujet aux erreurs lors de la redirection de la sortie vers des fichiers qui nécessitent des privilèges de superutilisateur.Prenons un répertoire avec ces fichiers:
Maintenant, exécutons la commande tail:
Ce qui précède est la dernière ligne de
crontab
et c'est ce que nous attendons. Toutefois:Les guillemets doubles éliminent ce problème:
Sans les guillemets doubles, le résultat de la substitution de commande est développé par le shell. L'une des extensions est l'extension du nom de chemin . Dans le cas ci-dessus, cela signifie qu'il
f*
est développé pour correspondre à chaque nom de fichier commençant parf
.À moins que vous ne vouliez explicitement des extensions de shell, mettez toutes vos variables shell et / ou substitutions de commandes entre guillemets.
la source
le mécanisme de globing shell sera étendu
*
au fichier local.crontab line est susceptible d'avoir un
*
espace réservé pour tout.Par exemple, cette ligne dans crontab fonctionne à 7h47 le dimanche, la première étoile signifie n'importe quel jour, la deuxième n'importe quel mois.
alors vous
tail
, et émettezqui se développera
*
dans un fichier local.la source