Perl: Après le succès de l'appel système “ou de mourir de la commande” encore des bouts de script
Je suis l'aide de la ligne suivante pour faire un simple appel système qui fonctionne:
system ("mkdir -p Purged") or die "Failed to mkdir." ;
L'exécution du script, le système d'appel et je peux trouver un répertoire appelé Purgés, mais le message d'erreur est toujours imprimé et le script meurt. Quel est le problème avec ma syntaxe?
Toute aide est très appréciée.
Éviter
system
lorsque Perl fournit un haut-équivalent. Utilisation make_path
à partir de File::Path
à la place.OriginalL'auteur user3481208 | 2014-03-31
Vous devez vous connecter pour publier un commentaire.
Oui, il est source de confusion que la
system
commande inverse le vrai et le faux en Perl, et crée le plaisir de la logique comme ceci:Mais, il est facile de comprendre pourquoi le
system
de commande. Sous Unix, un statut de sortie de zéro signifie que le programme a travaillé, et un état différent de zéro pourrait vous donner des informations pour lesquelles votresystem
échec de l'appel. Peut-être que le programme appelant n'existe pas. Peut-être que le programme de tri de a fonctionné comme prévu. Par exemple,grep
renvoie un code de sortie de1
quandgrep
fonctionne, mais il n'y avait pas de correspondance des lignes. Vous pourriez distinguer lorsquegrep
retourne zéro, un, ou un code de retour est supérieur à un. (Oui, je sais c'est idiot d'utiliser un système d'appel àgrep
dans un programme en Perl, mais c'est le premier exemple que je pouvais penser).Pour éviter casual confusion, je crée une variable qui contient le statut de sortie de mon
system
de commande au lieu de tester la sortie desystem
directement:C'est complètement inutile, et les gens qui travaillent avec Perl faut savoir que
system
inverse Perl définition de vrai et faux, mais si je n'avais pas eu mon café le matin, j'ai peut-il manquer que je vais sur quelqu'un d'autre code. En faisant ce petit geste tout à fait le programme de ressembler un peu plus logique.La Perldoc de système vous donner les code qui permet de tester la sortie de votre système de commande pour voir exactement ce qui s'est passé. (Si il y a une erreur, ou un système de signal d'interruption tué le
system
appel). Il est bon de savoir si vous devez interroger votresystem
valeur de retour de comprendre ce qui s'est passé.OriginalL'auteur David W.
system
retourne le statut de sortie de la commande qu'il appelle. Dans le shell, le zéro de l'état de sortie est synonyme de réussite. Vous avez à inverser la logique:OriginalL'auteur choroba
system
retourne0
en cas de succès, donc, vous voulezand
plutôt queor
.Voir aussi:
use autodie qw( system );
OriginalL'auteur ikegami
Pour ajouter ce qui n'a pas été mentionné et ce qui peut tranquillement mess gens.
La
system
le retour de "zéro-ou-pas" seulement dit que la commande a été exécuté avec succès, par le shell ouexecvp
; ainsi0
ne signifie pas que la commande elle-même réussi à ce qu'il était en train de faire.En cas de retour non nul, pour plus d'informations vous avez besoin pour décompresser
$?
: la commande réelle de code de sortie est$? >> 8
, qui contient tout ce que le programme exécuté a été conçu pour comminicate lors de sa sortie. (Pour l'une de ses sortie vous devez utiliserqx
ou diverses canalisations s'ouvre à la place desystem
.)En tout, vous voudrez peut-être faire quelque chose à l'effet de
Cela n'a pas besoin d'être dans un sous bien sûr, vous pouvez faire
system == 0 or do { ... };
ou tel droit dans le code, et se contente d'imprimer l'erreur avecwarn
. Mais de cette façon, vous avez une petite bibliothèque, où vous pouvez affiner votre gestion des erreurs plus facilement, etc.Étant un utilisateur de niveau de facilité, il est logique qu'elle retourne true en cas de succès (nous ne sommes pas à changer de système de design).
En outre, dans ce cas,
mkdir -p
est destiné à être calme et il peut très bien ne pas jeter les erreurs, même si elle ne peut pas faire sa chose. C'est par la conception de cours, mais il faut être bien conscient.OriginalL'auteur zdim