Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ordre des arguments dans bash

8 réponses
Avatar
Tipoun
Bonjour =E0 tous,

Je suis =E0 la recherche d'une feature un peu sp=E9ciale : sous n'importe
quel Linux, je pouvais mettre les arguments des commandes du terminal
dans n'importe quelle position et elles =E9taient prises en compte.
Ex : cp toto tata -rf
Lorsque j'essaye sous Mac, dans le terminal, je n'arrive pas =E0
reproduire cette fonction.
Il consid=E8re "-rf" comme un fichier :/
Y a-t-il un moyen ?

Cordialement,
Tipoun

8 réponses

Avatar
Paul Gaborit
À (at) Mon, 14 Sep 2009 09:39:25 -0700 (PDT),
Tipoun écrivait (wrote):
Je suis à la recherche d'une feature un peu spéciale : sous n'importe
quel Linux, je pouvais mettre les arguments des commandes du terminal
dans n'importe quelle position et elles étaient prises en compte.
Ex : cp toto tata -rf
Lorsque j'essaye sous Mac, dans le terminal, je n'arrive pas à
reproduire cette fonction.
Il considère "-rf" comme un fichier :/
Y a-t-il un moyen ?



Un moyen simple ? Non.
Bienvenue dans le monde *BSD.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Avatar
blanc
Tipoun wrote:

Je suis à la recherche d'une feature un peu spéciale : sous n'importe
quel Linux, je pouvais mettre les arguments des commandes du terminal
dans n'importe quelle position et elles étaient prises en compte.
Ex : cp toto tata -rf



Les arguments de chaque appli sont gérées par l'appli elle-même. La
recommendation pour Unix est de mettre les options (-rf dans ton
exemple) en premier. Mis à part quelques exceptions (qui sont en général
documentées dans le man des applis concernées) , c'est àmha
universellement vérifié.

En ce qui concerne cp (par exemple) je n'est jamais vu d'implantation ou
les options seraient n'importe où. Ce qui veut dire que c'est
l'implantation de cp dans ton linux qui est une exception. Pas celle de
Mac OS X.
J'ajouterais même que ton exemple me surprend, car lorsqu'on connait la
syntaxe de cp (voir le man) cela parait difficile (bien que pas
impossible) d'analyser une ligne de commande où les options seraient
n'importe où.
Je veux dire par exemple que si je fais la commande :
cp * toto -rf
dans un répertoire qui contient 10000 fichiers, le système (car c'est
lui qui le fait sous Unix) va remplacer l'étoile par la liste des 10000
fichiers. Ce qui fait que la commande cp devrait lire les 10002
arguments qu'elle reçoit avant de voir que le dernier est une option,
prendre en compte cette option, puis relire les 10001 premiers arguments
pour faire la copie. Cela me paraît une perte de temps (et c'est ce qui
explique la recommendation : les options en premier)
--
JiPaul.
/ /--/--// Jean-Paul Blanc
|/| L | quelquepart en (somewhere in)
/|| = ||| FRANCE
Avatar
Franck
JiPaul wrote:
dans un répertoire qui contient 10000 fichiers, le système (car c'e st
lui qui le fait sous Unix) va remplacer l'étoile par la liste des 100 00
fichiers.



Soyons précis, ce n'est pas le "système" qui remplace l'étoile par la
liste des fichiers, mais le shell.
Avatar
blanc
Franck <franck+ wrote:

Soyons précis, ce n'est pas le "système" qui remplace l'étoile par la
liste des fichiers, mais le shell.



Exact. J'ai dit "système" car pour moi le shell fait partie du système :

Système = noyau + coquille

même si le shell est interchangeable.
--
JiPaul.
/ /--/--// Jean-Paul Blanc
|/| L | quelquepart en (somewhere in)
/|| = ||| FRANCE
Avatar
Tipoun
On Sep 15, 9:42 am, (JiPaul) wrote:
Franck <franck+ wrote:
> Soyons précis, ce n'est pas le "système" qui remplace l'étoile pa r la
> liste des fichiers, mais le shell.

Exact. J'ai dit "système" car pour moi le shell fait partie du systèm e :

Système = noyau + coquille

même si le shell est interchangeable.
--
                JiPaul.    
/ /--/--//                         Jean-Paul Bl anc
|/| L   |                quelquepart en   (somewhe re in)
/|| = |||                             F RANCE




Un moyen simple ? Non.
Bienvenue dans le monde *BSD.


Arf, dommage :/

En ce qui concerne cp (par exemple) je n'est jamais vu d'implantation ou
les options seraient n'importe où. Ce qui veut dire que c'est
l'implantation de cp dans ton linux qui est une exception. Pas celle de
Mac OS X.


C'est le cas sous Debian et Archlinux (et je pense sous tous les
Linux, bien que je n'ai pas vérifié).

le système (car c'est lui qui le fait sous Unix) va remplacer l'étoil e par la liste des 10000
fichiers. Ce qui fait que la commande cp devrait lire les 10002
arguments qu'elle reçoit avant de voir que le dernier est une option,
prendre en compte cette option, puis relire les 10001 premiers arguments
pour faire la copie. Cela me paraît une perte de temps (et c'est ce qui
explique la recommendation : les options en premier)


Pour avoir déjà travailler avec des options dans un programme, ce
n'est pas exactement de cette façon que cela fonctionne.
La fonction utilisée pour analyser les options est getopt() (http://
www.gnu.org/s/libc/manual/html_node/Example-of-Getopt.html#Example-of-Getop t).
Dans tous les cas, les arguments de la commande seront tous lu une
seule fois. Dès que la fonction trouve un "-", elle considère que
c'est une option et ensuite exécute différents tests pour déterminer
précisément l'option.
L'exécution à proprement parler de la commande (dans notre cas cp), ne
sera faite qu'après cette analyse.

C'est pour cette raison que je m'étonnais de l'ordre obligatoire à
respecter sous Mac OS X.

Merci pour vos réponses.
Cordialement
Avatar
Patrick Stadelmann
In article <1j62uuz.1hsgnxk1gk2fm6N%,
(JiPaul) wrote:

J'ajouterais même que ton exemple me surprend, car lorsqu'on connait la
syntaxe de cp (voir le man) cela parait difficile (bien que pas
impossible) d'analyser une ligne de commande où les options seraient
n'importe où.



Je confirme qu'à mon grand étonnement, la commande citée plus haut
fonctionne sous Fedora, même si le man indique que les options viennent
au début.

Patrick
--
Patrick Stadelmann
Avatar
Franck
Tipoun wrote:
La fonction utilisée pour analyser les options est getopt() (http://
www.gnu.org/s/libc/manual/html_node/Example-of-Getopt.html#Example-of-G etopt).
Dans tous les cas, les arguments de la commande seront tous lu une
seule fois. Dès que la fonction trouve un "-", elle considère que
c'est une option et ensuite exécute différents tests pour détermi ner
précisément l'option.



Justement, c'est ce comportement, qui sous Linux, n'est pas conforme à
la norme POSIX.

La "manpage" de getopt (man 3 getopt) indique d'ailleurs que l'on peut
obtenir sous Linux un comportement POSIX en positionnant la variable
d'environnement POSIXLY_CORRECT à 1. Dans ce cas le cp de Linux retrouv e
un comportement identique à toutes les autres plateformes *nix.
Avatar
TK
Tipoun a écrit :
Je suis à la recherche d'une feature un peu spéciale : sous n'importe
quel Linux, je pouvais mettre les arguments des commandes du terminal
dans n'importe quelle position et elles étaient prises en compte.
Ex : cp toto tata -rf
Lorsque j'essaye sous Mac, dans le terminal, je n'arrive pas à
reproduire cette fonction.
Il considère "-rf" comme un fichier :/
Y a-t-il un moyen ?



Pas trop top les arguments à la fin (c'est avec ce genre de détails
qu'on réalise vraiment que GNU is not UNIX), mais enfin chacun ses goûts.

Le moyen le plus "simple" reste de compiler les GNU coreutils. Ensuite
faire un alias de cp vers le répertoire ou ils sont installés (genre
/usr/gnu/bin/cp). On peut aussi changer le PATH mais attention aux
effets de bord.

Thomas