• [^] # Re: Les arguments

    Posté par . En réponse au message Utiliser le terminal Linux pour compiler en C. Évalué à 4.

    Ça n'est pas un hack, on peut mettre ce qu'on veut dans le argv[0] en argument de execve(). Le fait d'y mettre le nom du programme est juste une convention qui est plus ou mois respectée, mais il y a des exceptions par exemple pour conditionner le fonctionnement d'un programme. Par exemple si on met un tiret avant le nom du shell dans argv[0] il se comporte differemment. ("A login shell is one whose first character of argument zero is a -, or one started with the --login option.")
    Il y a aussi des situations réelles comme le shebang où le nom du programme tel qu'appelé ne se retrouve pas en argv[0] mais en argv[1]:

    edelweiss:~$ cat print_args.c 
    #include <stdio.h>
    int main(int argc, char **argv)
    {
     while (*argv)
     puts(*argv++);
     return 0;
    }
    edelweiss:~$ gcc -o print_args print_args.c 
    edelweiss:~$ cat toto.sh 
    #!/home/edelweiss/print_args
    edelweiss:~$ ./toto.sh 
    /home/edelweiss/print_args
    ./toto.sh
    
    

    Bizarrement, bash cache ce mecanisme dans les scripts:

    edelweiss:~$ cat toto2.sh 
    #!/bin/bash
    echo 0ドル 1ドル
    edelweiss:~$ ./toto2.sh 
    ./toto2.sh