2014-06-30 6 views

Répondre

0
#! /bin/sh 
# try executing this script with several arguments to see the effect 

test ".$INNERCALL" = .YES || { 
    export INNERCALL=YES 
    # this method works both for shell and bash interpreters 
    sh -c ". '$0'" argv0new "[email protected]" 
    exit $? 
} 

printf "argv[0]=$0\n" 
i=1 ; for arg in "[email protected]" ; do printf "argv[$i]=$arg\n" ; i=`expr $i + 1` ; done 
+3

Il y a plusieurs façons d'améliorer cette réponse. Une explication de ce qui se passe serait utile. Vous pourriez rendre le code d'appel interne plus concis en utilisant 'INNERCALL = YES exec sh -c '.' $ 0 '" argv0new "$ @" '. Je suis un peu méfiant qu'il y a des façons de briser le '. La commande '$ 0'', mais les techniques que je peux immédiatement penser à cela nécessiteraient des configurations suffisamment inhabituelles que je peux laisser de côté. Mais sans l'explication, je ne peux pas considérer cela comme une bonne réponse. –

+0

@JonathanLeffler Tout logiciel est bon quand ça marche. Le code source est la meilleure explication;) – sqrt163

+0

Clairement pas. Voir cette question complémentaire: https://stackoverflow.com/questions/48407615/how-to-change-argv0-value-using-bash-shell-explanation-required – tripleee

1

Voici une autre méthode. Il est implémenté par l'exécution de commandes directes qui est quelque peu meilleure que l'approvisionnement (la commande point). Mais, cette méthode ne fonctionne que pour interpréteur de commandes, pas bash, puisque les options -c de sh supports passés ensemble:

#! /bin/sh 
# try executing this script with several arguments to see the effect 

test ".$INNERCALL" = .YES || { 
    export INNERCALL=YES 
    cat "$0" | /bin/sh -s -c : argv0new "[email protected]" 
    exit $? 
} 

printf "argv[0]=$0\n" 
i=1 ; for arg in "[email protected]" ; do printf "argv[$i]=$arg\n" ; i=`expr $i + 1` ; done 

Le résultat attendu des deux exemples dans le cas ./the_example.sh 1 2 3 devrait être:

argv[0]=argv0new 
argv[1]=1 
argv[2]=2 
argv[3]=3 
+0

Etrangement, si vous changez tout '/ bin/sh' en'/bin/bash', il arrête de fonctionner. C'est sur une installation Ubuntu 16.04 LTS. D'une façon ou d'une autre, à un certain moment, les dieux de Linux ont choisi de faire de/bin/sh une sorte de "tiret" et non pas de/bin/bash. La réponse choisie http://stackoverflow.com/a/24581562/257924 n'a pas ce problème. – bgoodr

+0

@bgoodr avez-vous lu la phrase 3d de cette réponse? – sqrt163

+0

D'accord. Si j'avais lu cette phrase clairement, ce que je n'ai pas fait, "puisque sh soutient" aurait dû me permettre d'interpréter "shell interpreter" comme l'interprète '/ bin/sh' dans ce contexte. – bgoodr

Questions connexes