quel shell pour script shell ??

Le
Thomas
quand on fait un script sans preciser "#!/bin/sh" au debut,
est ce que c'est executé avec le shell courant ou avec sh ?

--
"In a world without walls and fences, who needs windows and gates ?"
"petit Free qui devient grand, gêne les requins blancs"

  • Partager ce contenu :
Vos réponses Page 1 / 2
Trier par : date / pertinence
Pascal Bourguignon
Le #489571
Thomas
quand on fait un script sans preciser "#!/bin/sh" au debut,
est ce que c'est executé avec le shell courant ou avec sh ?


Si je ne me trompe, c'est le shell courant qui l'exécute. Comme il
n'y a pas de #!, le noyau ne peut pas savoir que c'est un exécutable.
D'où l'intérêt de toujours mettre #!/bin/sh au début de ses scripts.

D'un autre côté, on peut s'amuser à faire des programmes valides pour
plusieurs langages à la fois. J'avais un programme qui pouvait être
exécuté par csh, sh, C et Fortran, mais je ne le trouve plus...

--
__Pascal Bourguignon__ http://www.informatimago.com/

Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we.

Thomas
Le #489569
In article (Dans l'article)
Pascal Bourguignon
Thomas
quand on fait un script sans preciser "#!/bin/sh" au debut,
est ce que c'est executé avec le shell courant ou avec sh ?


Si je ne me trompe, c'est le shell courant qui l'exécute. Comme il
n'y a pas de #!, le noyau ne peut pas savoir que c'est un exécutable.
D'où l'intérêt de toujours mettre #!/bin/sh au début de ses scripts.


ah c'est ca l'interet ? :-)

je sais que quand je fais des prgm je peux lancer des commandes à partir
de mon prgm (binaire)
soit directement,
soit via un shell
donc un script shell qui commence avec #!/bin/sh je peux le lancer
directement, le noyau sait qu'il faut l'executer avec un shell ?

c'est genial ca :-))

--
"In a world without walls and fences, who needs windows and gates ?"
"petit Free qui devient grand, gêne les requins blancs"


Pascal Bourguignon
Le #485155
Thomas
In article (Dans l'article)
Pascal Bourguignon
Thomas
quand on fait un script sans preciser "#!/bin/sh" au debut,
est ce que c'est executé avec le shell courant ou avec sh ?


Si je ne me trompe, c'est le shell courant qui l'exécute. Comme il
n'y a pas de #!, le noyau ne peut pas savoir que c'est un exécutable.
D'où l'intérêt de toujours mettre #!/bin/sh au début de ses scripts.


ah c'est ca l'interet ? :-)

je sais que quand je fais des prgm je peux lancer des commandes à partir
de mon prgm (binaire)
soit directement,
soit via un shell
donc un script shell qui commence avec #!/bin/sh je peux le lancer
directement, le noyau sait qu'il faut l'executer avec un shell ?

c'est genial ca :-))


C'est encore plus génial que ça. On peut utiliser presque n'importe
quel programme comme interpreteur pour un script. Il suffit qu'il
accepte des commandes prises dans un fichier passé en argument, (et
qu'il tienne compte de, (ou qu'il ignore) la première ligne '#!':


cat >pgm.c <<EOF
#include int main(int argc,char** argv){
FILE* input;
const char* script_name;
FILE* script;
{int i=1; while((argv[i]!=0)&&(argv[i][0]=='-')){i++;} script_name=argv[i];}
if(script_name){
script=fopen(script_name,"r");
printf("Opening %s --> %sn",script_name,script?"success":"failed");
if(script!=0){
if(!(('#'==fgetc(script))&&('!'==fgetc(script)))){
fclose(script);
script=0; }}}
input=script?script:stdin;
{ char buffer[128];
while(fgets(buffer,sizeof(buffer),input)){
printf("Read: %s",buffer); }}
return(0); }
EOF
gcc -o /usr/local/bin/pgm pgm.c

cat >test.pgm <<EOF
#!/usr/local/bin/pgm --example-option
The Third Law of Photography:
If you did manage to get any good shots, they will be ruined
when someone inadvertently opens the darkroom door and all of
the dark leaks out.
EOF
chmod 755 ./test.pgm
./test.pgm

===>

Opening ./test.pgm --> success
Read: /usr/local/bin/pgm --example-option
Read: The Third Law of Photography:
Read: If you did manage to get any good shots, they will be ruined
Read: when someone inadvertently opens the darkroom door and all of
Read: the dark leaks out.


Autre exemple:

cat >test.cat <<EOF
#!/bin/cat
Have vAX, will hack...
What is vice today may be virtue tomorrow.
EOF
chmod 755 ./test.cat
./test.cat test.pgm

===>

#!/bin/cat
Have vAX, will hack...
What is vice today may be virtue tomorrow.
#!/usr/local/bin/pgm --example-option
The Third Law of Photography:
If you did manage to get any good shots, they will be ruined
when someone inadvertently opens the darkroom door and all of
the dark leaks out.


--
__Pascal Bourguignon__ http://www.informatimago.com/

Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we.



Thomas
Le #485150
In article (Dans l'article)
Pascal Bourguignon
Thomas
In article (Dans l'article)
Pascal Bourguignon
Thomas
quand on fait un script sans preciser "#!/bin/sh" au debut,
est ce que c'est executé avec le shell courant ou avec sh ?


Si je ne me trompe, c'est le shell courant qui l'exécute. Comme il
n'y a pas de #!, le noyau ne peut pas savoir que c'est un exécutable.
D'où l'intérêt de toujours mettre #!/bin/sh au début de ses scripts.


ah c'est ca l'interet ? :-)

je sais que quand je fais des prgm je peux lancer des commandes à partir
de mon prgm (binaire)
soit directement,
soit via un shell
donc un script shell qui commence avec #!/bin/sh je peux le lancer
directement, le noyau sait qu'il faut l'executer avec un shell ?

c'est genial ca :-))


C'est encore plus génial que ça. On peut utiliser presque n'importe
quel programme comme interpreteur pour un script. Il suffit qu'il
accepte des commandes prises dans un fichier passé en argument, (et
qu'il tienne compte de, (ou qu'il ignore) la première ligne '#!':


effectivement "C'est encore plus gnial que ca." :-)))

je prends note, ca peut servir ;-)


un detail : le nom du fichier est inséré comme 1er argument ?

en fait, c'est inséré
- apres les arguments qu'on met apres le nom du prgm au debut du fichier,
- avant les arguments qu'on met apres le nom du fichier dans le shell,
c'est ca ?



ps : une urgence : sais tu, pour le set user id ? merci :-)

--
"In a world without walls and fences, who needs windows and gates ?"
"petit Free qui devient grand, gêne les requins blancs"




Pascal Bourguignon
Le #484972
Thomas
un detail : le nom du fichier est inséré comme 1er argument ?


Tu peux expérimenter en ajoutant cette ligne au début de pgm.c:

{int i=0; while(argv[i]!=0){printf("argv[%d]=%sn",i,argv[i]);}}

en fait, c'est inséré
- apres les arguments qu'on met apres le nom du prgm au debut du fichier,
- avant les arguments qu'on met apres le nom du fichier dans le shell,
c'est ca ?


./script arg-cmd-1 arg-cmd-2
avec $(head -1 script) = "#!/usr/local/bin/pgm arg-script-1 arg-script-2"

donne l'argv suivant dan pgm:

/usr/local/bin/pgm arg-script-1 arg-script-2 ./script arg-cmd-1 arg-cmd-2

La ligne de commande est concaténée à la ligne '#!'.


ps : une urgence : sais tu, pour le set user id ? merci :-)


Un script peut être mis en setuid (ou setgid) u+s ou g+s.

MAIS, comme ça pose des problèmes de sécurité, les shells modernes
(bash, perl, etc) enlèvent en général le setuid. Pour l'éviter et
conserver l'uid du script, il faut ajouter des options (voir par
exemple set -p dans bash).


--
__Pascal Bourguignon__ http://www.informatimago.com/

Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we.

Thomas
Le #484971
In article (Dans l'article)
Pascal Bourguignon
merci pour les precisions :-)

ps : une urgence : sais tu, pour le set user id ? merci :-)


Un script peut être mis en setuid (ou setgid) u+s ou g+s.

MAIS, comme ça pose des problèmes de sécurité, les shells modernes
(bash, perl, etc) enlèvent en général le setuid. Pour l'éviter et
conserver l'uid du script, il faut ajouter des options (voir par
exemple set -p dans bash).


ah oui, t'as pas suivi le fil correspondant, pardon :-)

je savais deja tout ca, il ne me manquait plus que la dite option sous
sh :-)
tu la connais pas, toi ? :-)

au pire, y a pas trop de differences entre sh et bash ?
parce que moi, bash, je ne connais pas du tout :-(


(et, non, je n'ai pas envie de m'y mettre, parce que mon langage préféré
c'est ada,
et je ne fais de scripts qu'en cas de nécessité, j'ai cru comprendre que
ce qui ressortait des discussions que le meilleur c'etait sh parce que
en gros c'est l'original, je sais qu'il y a des gens qui ne sont pas
d'accord mais je n'ai pas envie de rentrer dans des polemiques, etc ...
;-)) )

--
"In a world without walls and fences, who needs windows and gates ?"
"petit Free qui devient grand, gêne les requins blancs"


Pascal Bourguignon
Le #484970
Thomas
au pire, y a pas trop de differences entre sh et bash ?
parce que moi, bash, je ne connais pas du tout :-(


(et, non, je n'ai pas envie de m'y mettre, parce que mon langage préféré
c'est ada,
et je ne fais de scripts qu'en cas de nécessité, j'ai cru comprendre que
ce qui ressortait des discussions que le meilleur c'etait sh parce que
en gros c'est l'original, je sais qu'il y a des gens qui ne sont pas
d'accord mais je n'ai pas envie de rentrer dans des polemiques, etc ...
;-)) )


Est ce que tu as sh sur ton ordinateur?
Sur MacOSX, il n'y a pas sh, il y a bash (et un lien sh --> bash dans /bin).

--
__Pascal Bourguignon__ http://www.informatimago.com/

Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we.

Thomas
Le #484969
In article (Dans l'article)
Pascal Bourguignon
Thomas
au pire, y a pas trop de differences entre sh et bash ?
parce que moi, bash, je ne connais pas du tout :-(


(et, non, je n'ai pas envie de m'y mettre, parce que mon langage préféré
c'est ada,
et je ne fais de scripts qu'en cas de nécessité, j'ai cru comprendre que
ce qui ressortait des discussions que le meilleur c'etait sh parce que
en gros c'est l'original, je sais qu'il y a des gens qui ne sont pas
d'accord mais je n'ai pas envie de rentrer dans des polemiques, etc ...
;-)) )


Est ce que tu as sh sur ton ordinateur?
Sur MacOSX, il n'y a pas sh, il y a bash (et un lien sh --> bash dans /bin).


ah ?? ben si tu le dis j'ai pas alors

si ils ont fait ca, c'est que tout ce que sh sait faire, bash sait faire
et fait pareil ? (j'espere !)


sinon, au secours !! :-(
je te met precisément ce que j'ai, sans tricher (si, juste une chose, je
coupe l'ipv6) :

[tdecontes:~] thomas% netstat -nr
Routing tables

Internet:
Destination Gateway Flags Refs Use Netif
Expire
default 192.168.1.1 UGSc 7 2 ppp0
81.56.128.208 192.168.254.254 UGHS 104 123 ppp1
127.0.0.1 127.0.0.1 UH 8 39180 lo0
192.168.1.1 192.168.1.202 UH 8 0 ppp0
[tdecontes:~] thomas% cat bin/vpnroutage
#!/bin/bash -p


echo route delete default 192.168.1.1
echo route add default 192.168.254.254
echo route add -net 192.168.1 192.168.1.1

route delete default 192.168.1.1
route add default 192.168.254.254
route add -net 192.168.1 192.168.1.1
[tdecontes:~] thomas% l bin/vpnroutage
-r-srwx--- 1 root staff 241 Aug 15 02:25 bin/vpnroutage
[tdecontes:~] thomas% vpnroutage
route delete default 192.168.1.1
route add default 192.168.254.254
route add -net 192.168.1 192.168.1.1
route: must be root to alter routing table
route: must be root to alter routing table
route: must be root to alter routing table
[tdecontes:~] thomas%


merci pour toute ton aide :-)

--
"In a world without walls and fences, who needs windows and gates ?"
"petit Free qui devient grand, gêne les requins blancs"


Thomas
Le #484794
In article (Dans l'article)
Pascal Bourguignon
Thomas
au pire, y a pas trop de differences entre sh et bash ?
parce que moi, bash, je ne connais pas du tout :-(


(et, non, je n'ai pas envie de m'y mettre, parce que mon langage préféré
c'est ada,
et je ne fais de scripts qu'en cas de nécessité, j'ai cru comprendre que
ce qui ressortait des discussions que le meilleur c'etait sh parce que
en gros c'est l'original, je sais qu'il y a des gens qui ne sont pas
d'accord mais je n'ai pas envie de rentrer dans des polemiques, etc ...
;-)) )


Est ce que tu as sh sur ton ordinateur?
Sur MacOSX, il n'y a pas sh, il y a bash (et un lien sh --> bash dans /bin).


ah non !
sans avoir rien installé d'autre que ce qui est sur le CD :

[tdecontes:] thomas% l /bin/sh
-r-xr-xr-x 1 root wheel 540884 Jul 29 02:04 /bin/sh
[tdecontes:] thomas%

--
"In a world without walls and fences, who needs windows and gates ?"
"petit Free qui devient grand, gêne les requins blancs"


Marc Lasson
Le #484791
Pascal Bourguignon wrote:

C'est encore plus génial que ça. On peut utiliser presque n'importe
quel programme comme interpreteur pour un script. Il suffit qu'il
accepte des commandes prises dans un fichier passé en argument, (et
qu'il tienne compte de, (ou qu'il ignore) la première ligne '#!':


$cat loop
#! ./loop
$./loop
$

Ca "marche" pas :/.

--
Marc.

Poster une réponse
Anonyme