En bash, je remarque que si une commande utilisant la redirection échoue, tous les programmes qui s'exécutent avant cela ne sont pas exécutés.
Par exemple, ce programme ouvre le fichier "a" et écrit 50 octets dans le fichier "a". Cependant, l'exécution de cette commande avec redirection vers un fichier avec des autorisations insuffisantes (~ root / log), ne produit aucun changement dans la taille du fichier de "a".
$ ./write_file.py >> ~root/log
-bash: /var/root/log: Permission denied
cdal at Mac in ~/experimental/unix_write
$ ls -lt
total 16
-rw-rw-r-- 1 cdal staff 0 Apr 27 08:54 a <-- SHOULD BE 50 BYTES
On pourrait penser que le programme fonctionnerait, capturer n'importe quelle sortie (mais aussi écrire dans le fichier "a"), puis échouer à écrire n'importe quelle sortie dans ~ root / log. Au lieu de cela, le programme n'est jamais exécuté.
Pourquoi cela et comment bash choisit-il l'ordre des "vérifications" qu'il effectue avant d'exécuter un programme? D'autres contrôles sont-ils également effectués?
ps J'essaie de déterminer si un programme exécuté sous cron s'est réellement exécuté lorsqu'il a été redirigé vers un fichier "permission refusée".
write_file.py
programme et envoyez sa sortie à ~root/log
bash:" Désolé, mais vous n'êtes pas autorisé à écrire dans ce fichier! "Le shell fait exactement ce qu'il doit faire. S'il ne peut pas faire ce que vous lui avez demandé de faire faire, il vous informe immédiatement pourquoi il y a un problème, vous donnant la possibilité de décider comment y faire face. Pour tous les responsables de bash savent, de très mauvaises choses peuvent se produire si vous exécutez cette commande et ne parvenez pas à enregistrer la sortie. Si c'était assez important que vous ayez désigné un endroit pour le sauvegarder, ce serait une erreur pour ASS | U | ME que c'était OK de courir sans enregistrer stdout.
stdout
pour faire exactement cela. Ainsi, vous ne verrez aucune sortie, même si votre programme s'est exécuté.