Je comprends que ce qui explique () et que la famille exige que le premier argument de son tableau d'argumentation soit identique à celui de l'exécutable qui est également dirigé par son premier argument. C'est-à-dire:
/bin/ls /bin/ls /home/john
4 Réponses :
Selon Ce , le premier argument étant le nom du programme est une personnalisation. p>
par coutume, le premier élément devrait être le nom du programme exécuté (pour Exemple, le dernier composant du chemin) P> blockQuote>
Cela dit, ces valeurs pourraient être différentes. Si par exemple, le programme a été lancé à partir d'un lien symbolique. Le nom du programme peut être différent de celui du lien utilisé pour le lancer. P>
Et vous avez raison. La coquille ferait normalement le travail de la configuration du premier argument. Dans ce cas cependant, l'utilisation de l'exécution contourne la coque tout à fait - c'est pourquoi vous devez le configurer vous-même. P>
Il vous permet de spécifier le chemin exact à l'exécutable à charger, mais permet également un nom "beautifié" d'être présenté dans des outils tels que PS code> ou
haut code >.
execl("/bin/ls", "ls", "/home/john", (char *)0);
Vous avez besoin de citations doubles; et probablement un charnel NULL * pour mettre fin à la liste des arguments, en supposant que vous utilisez EXECL ().
Je vais prendre votre parole pour cela, mais vous avez intéressé, j'ai créé un test qui exécute un script Bash simple qui accueille 0 $, et même lorsque j'utilise un nom de programme "compréfié", 0 $ sera toujours le chemin complet (construit à partir de () C'est premier argument, alors je suppose).
Certains programmes utilisent également ARG [0] pour déterminer quoi faire: Par exemple, Busybox fait cela. Je crois que Bash change également son comportement, en fonction de ce que vous l'invoquez comme. ( bash code> ou juste
sh code>)
Il n'est pas nécessaire que le premier des arguments portent une relation avec le nom de l'exécutable: essayez-le - sur un Mac (après trois tests): P> La sortie de la troisième exécution était la suivante: p> EBM Commentaires: P> Ouais, et cela rend encore plus étrange. Dans mon script Bash de test (la cible de l'exécutif), je ne vois pas la valeur de ce qui est exécuté dans ARG [0] n'importe où - non dans l'environnement et non à 0 $. P>
blockQuote> révision de l'expérience - Un script appelé "bash.script": p> et un programme révisé: p> Cela donne la sortie PS: p> Il y a deux possibilités, car je le vois: p> Comment établir la différence? Je suppose copier la coquille à un nom de remplacement, puis en utilisant ce nom alternatif dans le shebang nous dirait quelque chose: p> ceci, je pense, indique que le noyau réécrit argv [0] code> lorsque le mécanisme de Shebang est utilisé. p> Adressant le commentaire de N. / P>
#! / bin / bash code>') ligne ou li>
MiniMac JL: cat bash.script
#!/Users/jleffler/tmp/soq/al -arg0
#!/bin/bash
#!/Users/jleffler/tmp/soq/jiminy.cricket
echo "bash script at sleep (0: $0; *: $*)"
sleep 30
MiniMac JL: ./x
/Users/jleffler/tmp/soq/al
-arg0
./bash.script
30
MiniMac JL:
Oui, et cela rend encore plus étrange. Dans mon script Bash de test (la cible de l'exécutif), je ne vois pas la valeur de ce qui est exécuté en arg [0] n'importe où - non dans l'environnement et non à 0 $.
Faire un script #! / Home / moi / print_args code> et écrivez un programme d'affichage d'impression simple pour être sûr qui triple avec
argv [0] code>
qui permet à un programme d'avoir de nombreux noms et de travailler légèrement différemment en fonction de l'utilisation du nom de son nom.
Programme trivial d'imagerie, par exemple. imprimer0.c compilé dans print0: p> exécuter comme ./print0 imprimerait artefact de * Nix, mais agréable d'avoir néanmoins. P> P> ./ print0 code> faire un lien symbolique .. Print1 à elle et utilisez maintenant Nom ./print1 pour l'exécuter - il imprimerait "./print1".<
Consultez mon commentaire à Jonathan Leffler ci-dessus - en utilisant un script de test Bash comme cible de l'appel de l'exécution, arg [0] ne s'affiche pas n'importe où. Peut-être qu'un programme C obtient ses arguments différemment, mais au moins pour un script Bash, cette fonctionnalité que vous expliquez, semble absente.
Oui, Shell's EXED ne le permet pas. Il faudrait utiliser un programme de liaison symbolique pour appeler sous un nom différent.
Dans Bash, vous pouvez utiliser (exécuté -a arg0 quelque_program arg1 arg2) code>. J'ai utilisé un
(Subshell) code> car cela fonctionne uniquement avec
EXEC code>, remplaçant la coque actuelle ou le sous-(-shell.