#!/usr/bin/env perl use warnings; use strict; use 5.012; use IPC::System::Simple qw(system); system( 'xterm', '-geometry', '80x25-5-5', '-bg', 'green', '&' ); say "Hello"; say "World"; I tried this to run the xterm-command in the background, but it doesn't work: No absolute path found for shell: & What would be the right way to make it work?
4 Réponses :
Avez-vous essayé? http: //www.rocketware.com/perl/perlfaq8/how_do_i_start_a_process_in_the_.htm p> p>
Perl's's System fonction a deux modes: p>
Dans la première forme, vous devez faire attention à échapper aux personnages qui pourraient avoir une signification spéciale pour la coquille. La deuxième forme est généralement plus sûre puisque les arguments sont transmis directement au programme étant exécuté sans que la coque soit impliquée. P>
Dans votre cas, vous semblez mélanger les deux formes. Le caractère Comme Jakob Kruse a déclaré que la réponse simple est d'utiliser la forme unique du système Si vous préférez utiliser le formulaire multi-argument, vous devez appeler Fourche () puis utilisez probablement Exec () plutôt que & code> n'a la signification de "Démarrer ce programme en arrière-plan" si elle est transmise à la coquille. Dans votre programme, l'AMPersand est adopté en tant que 5ème argument de la commande Xterm. P>
système code>. Si l'un des arguments provenait d'une source non approuvée, vous devez utiliser citant ou échapper pour les sécuriser. P>
système () code>. p>
TLDR; b> système ("./ script.sh $ $ arg1 &"); code> au lieu de
système ("./ script.sh", "$ arg1", "&"); code>
Notez que le formulaire de liste de système est spécifiquement là pour pas Traitez des caractères tels que de Perlfaq8 's réponse à Comment puis-je lancer un processus en arrière-plan? p> (contribué par Brian D Foy) P>
Il n'y a pas un seul moyen d'exécuter du code en arrière-plan, vous n'avez donc pas besoin d'attendre que la fin de votre programme ne passe à d'autres tâches. La gestion des processus dépend de votre système d'exploitation particulier et de nombreuses techniques sont en Perlipc. P>
Plusieurs modules CPAN peuvent être capables d'aider, notamment IPC :: Open2 ou IPC :: Open3 , IPC :: Run , Parallel :: Emploi , Parallel :: Forkmanager , poe , proc :: fond et win32 :: processus . Il existe de nombreux autres modules que vous pourriez utiliser, alors vérifiez également ces espaces de noms pour d'autres options. P>
Si vous êtes sur un système de type UNIX, vous pourrez peut-être vous éloigner avec un appel système où vous mettez un et à la fin de la commande: P>
& code> comme shell méta-caractères.
unless ($pid = fork) {
unless (fork) {
exec "what you really wanna do";
die "exec failed!";
}
exit 0;
}
waitpid($pid, 0);
Ce n'est pas purement une explication pour Perl. Le même problème est sous C et d'autres langues.
Comprend d'abord ce que la commande forte> System forte> fait: p>
Peu importe si vous passez plusieurs arguments ou un argument. La différence est, avec plusieurs arguments, la commande est exécutée directement. Avec un argument, la commande est enveloppée par la coque, et finalement exécutée comme suit: p> lorsque vous passez une commande comme Quand vous voulez Implémentez ce mécanisme directement dans votre script, vous devez: P> C'est pourquoi vous pouvez exécuter le processus en arrière-plan. J'espère que c'est simple. P> L'exemple le plus simple: p>
si code>), utilisez la fonction
exécutée code>. Votre utilisateur est similaire à System STRY>, voir le manuel. AVIS,
EXEC CODE> provoque le programme de processus d'enfant / Contenu / Couverture de données par la commande exécutée. LI>
Testé ici semble travailler pour moi. Qu'est-ce que vous essayez d'accomplir?
Est-il censé ouvrir le terminal puis imprimer Bonjour World dans le terminal?
Ou essayez-vous simplement de faire un appel asynchrone pour ouvrir le terminal?
Le "dit" ne sont que pour vérifier si la xterm fonctionne en arrière-plan.
Je l'ai compris (en utilisant un seul argument) il y a quelque temps, mais dans l'intervalle, je l'ai oublié (vient de la forme moyenne «moyenne»?). J'espère que je l'oublie pas une seconde fois.