7
votes

Pourquoi d'abord Arg à diriger () doit être un chemin d'exécutable

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


0 commentaires

4 Réponses :


5
votes

Selon Ce , le premier argument étant le nom du programme est une personnalisation.

par coutume, le premier élément devrait être le nom du programme exécuté (pour Exemple, le dernier composant du chemin)

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.

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.


0 commentaires

6
votes

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);


3 commentaires

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 ou juste sh )



12
votes

Il n'est pas nécessaire que le premier des arguments portent une relation avec le nom de l'exécutable: xxx pré>

essayez-le - sur un Mac (après trois tests): P> xxx pré>

La sortie de la troisième exécution était la suivante: p> xxx pré>


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> xxx pré>

et un programme révisé: p> xxx Pré>

Cela donne la sortie PS: p> xxx pré>

Il y a deux possibilités, car je le vois: p>

  1. Le noyau jongle la ligne de commande lors de l'exécution du script via le shebang (' #! / bin / bash code>') ligne ou li>
  2. bash lui-même des dinks avec sa liste d'arguments. Li> ol>

    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> xxx pré>

    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>

    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: 
    


2 commentaires

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 et écrivez un programme d'affichage d'impression simple pour être sûr qui triple avec argv [0]



0
votes

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: xxx

exécuter comme ./print0 imprimerait ./ print0 faire un lien symbolique .. Print1 à elle et utilisez maintenant Nom ./print1 pour l'exécuter - il imprimerait "./print1".<

l 'étant avec un symbole symbolique. Mais avec la fonction EXEC * (), vous pouvez indiquer son nom son nom explicitement.

artefact de * Nix, mais agréable d'avoir néanmoins.


3 commentaires

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) . J'ai utilisé un (Subshell) car cela fonctionne uniquement avec EXEC , remplaçant la coque actuelle ou le sous-(-shell.