OVH Cloud OVH Cloud

Quelques questions

10 réponses
Avatar
Fred S
Je suis en ksh même si je pense que ça n'a pas d'importance ici

1/ Pourquoi ceci ne marche pas :
echo nomfichier | xargs vi

(je m'attendais ici à ce que vi ouvre le fichier nomfichier)
Ceci ne marche pas non plus :
echo nomfichier | vi

2/ J'ai remarqué que
vi `echo nomfichier`
marche

Y a-t-il 2 lignes équivalentes parmi les 3 suivantes parce que je m'y perd
un peu à vrai dire ? sinon quelles différences ?
commande1 `commande2`
commande2 | commande1
commande2 | xargs commande1

3/ Quelle est la taille limite d'un argument que je peux passer en paramètre
à un programme ?
(est-ce que je peux lancer un programme nomprog prenant une chaine de
caractères de 100000 caractères par exemple ?)

4/ Je suis tombé sur un script qui comporte l'instruction mknod
ne connaissant pas j'ai regardé les pages man, il semblerait que ça serve à
créer un répertoire servant à
stocker des fichiers spéciaux. Qu'appelle-t-on fichier spécial ?

Merci à tous de votre aide.

10 réponses

Avatar
Nicolas George
"Fred S" wrote in message <41813928$0$6933$:
1/ Pourquoi ceci ne marche pas :
echo nomfichier | xargs vi


Probablement parce que Vi s'attend à ce que son entrée standard soit un
terminal. C'est en tout cas le cas pour Vim.

commande1 `commande2`
commande2 | xargs commande1


Ces deux-ci sont vaguement équivalentes.

commande2 | commande1


Celle-ci n'a rien à voir du tout en revanche.

3/ Quelle est la taille limite d'un argument que je peux passer en paramètre
à un programme ?


`getconf ARG_MAX`

4/ Je suis tombé sur un script qui comporte l'instruction mknod
ne connaissant pas j'ai regardé les pages man, il semblerait que ça serve à
créer un répertoire servant à
stocker des fichiers spéciaux.


Non, elle sert à créer les fichiers spéciaux eux-mêmes.

Qu'appelle-t-on fichier spécial ?


Soit des tubes només (tels que si un programme l'ouvre en lecture, un autre
en écriture, ils se retrouvent en fait connectés), soit des devices, c'est à
dire des pseudo-fichiers gérés par le noyau pour fournir une interface à des
périphériques ou certaines fonctions. Essayer par exemple, après avoir mis
le son au maximum, quelque chose comme :

cat un_gros_fichier > /dev/dsp

ou

cat un_gros_fichier > /dev/audio

Avatar
Pascal Bourguignon
"Fred S" writes:

Je suis en ksh même si je pense que ça n'a pas d'importance ici

1/ Pourquoi ceci ne marche pas :
echo nomfichier | xargs vi


Oui, xargs est étrange... Voyons voir: man xargs

Mais chez moi (GNU/Linux): echo nomfichier | xargs vi
fonctionne parfaitement bien.


(je m'attendais ici à ce que vi ouvre le fichier nomfichier)
Ceci ne marche pas non plus :
echo nomfichier | vi

2/ J'ai remarqué que
vi `echo nomfichier`
marche

Y a-t-il 2 lignes équivalentes parmi les 3 suivantes parce que je m'y perd
un peu à vrai dire ? sinon quelles différences ?
commande1 `commande2`
commande2 | commande1
commande2 | xargs commande1


Ces deux là donnent dans certains cas le même résultat:

commande1 `commande2`
commande2 | xargs commande1


Celle là est différente.

commande2 | commande1



commande arg1 arg2 < input > output 2> error

argc==3
argv[0]=="commande"
argv[1]=="arg1"
argv[2]=="arg2"
argv[3]==0

fd=0 == input (stdin)
fd=1 == output (stdout)
fd=2 == error (stderr)



comamnd2 | commande arg1 arg2 > output 2> error
pareil sauf que:

fd=0 == données venant de command2 via un tube (stdin).



3/ Quelle est la taille limite d'un argument que je peux passer en paramètre
à un programme ?


Ça dépend du noyeau et du shell.


(est-ce que je peux lancer un programme nomprog prenant une chaine de
caractères de 100000 caractères par exemple ?)


En la prenant comment? Par devant ou par derrière?

En général, en argument: non.


4/ Je suis tombé sur un script qui comporte l'instruction mknod
ne connaissant pas j'ai regardé les pages man, il semblerait que ça serve à
créer un répertoire servant à
stocker des fichiers spéciaux. Qu'appelle-t-on fichier spécial ?


Sur unix, la hierarchie de nommage ne sert pas uniquement à nommer les
fichiers. Elle sert aussi à nommer les répertoires, les liens
symboliques, les volumes (/mnt ou ailleurs), les pilotes (/dev ou
ailleurs), les tubes nommés (/tmp ou ailleurs), les prises (/tmp ou
ailleurs) et beaucoup d'autres choses (/proc,...).

Ça simplifie beaucoup de choses: tous les objets manipulables dans le
système sont accessibles (ou non, selon les droits d'accès) dans la
hierarchie de nommage. Enfin presque tous, il y en a qui ne
comprennent rien et qui créent dans le système des objets non
accessibles...

Comme la page de manuel de mknod l'indique, ce qu'elle appelle les
fichiers spéciaux sont les pilotes en mode bloc, les pilotes en mode
caractères, et les tubes nommés.


En général, la liste des pilotes est figée, compilés dans le noyaux,
ou au mieux chargés dynamiquement par root, alors les utilisateurs
n'ont pas besoin de créer un fichier special pour accéder aux pilotes
car ils sont tous accéssibles via les fichiers speciaux dans /dev.

Mais root peut parfois ajouter des fichiers spéciaux pour accéder aux
pilotes afin de gérer finement les droits d'accès. Par exemple, s'il
y a un pilote pour un appareil Machine à Café /dev/mac0 qui a comme
droits d'accès:

crw------- 1 root root 196, 0 2004-10-28 22:17 /dev/mac0

un utilisateur Toto ne peut pas l'utiliser. Normal, l'administrateur
système root se réserve les droits d'utiliser la machine à café. Mais
maintenant si root veut permettre à un utilisateur Delphine d'utiliser
la machine à café, il peut créer un autre fichier spécial:

mknod c 196 0 /dev/mac0-delphine
chown delphine /dev/mac0-delphine
chmod 600 /dev/mac0-delphine

ce qui créé:

crw------- 1 delphine root 196, 0 2004-10-28 22:17 /dev/mac0-delphine

et qui permet à delphine d'utiliser le pilote en passant par ce
fichier spécial.


Mais le plus souvent, un utilisateur va utiliser mknod pour créer un
tube nommé. L'intérêt de la manipulation est quand on a un programme
mal foutu qui veut absolument lire ou écrire ses données dans un
fichier, si on lui donne un tube nommé à la place du fichier, on peut
le brancher sur un autre processus. Encore faut il pour que ça marche
que ce programme n'utilise que des accès séquentiels.

mknod p /tmp/output
grep 'donnee interessante' /tmp/output &
mauvais-programme -o /tmp/output



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

Voting Democrat or Republican is like choosing a cabin in the Titanic.

Avatar
cedric
Pascal Bourguignon wrote:
Ça simplifie beaucoup de choses: tous les objets manipulables dans le
système sont accessibles (ou non, selon les droits d'accès) dans la
hierarchie de nommage. Enfin presque tous, il y en a qui ne
comprennent rien et qui créent dans le système des objets non
accessibles...


Comme les interfaces réseaux par exemple ?

Avatar
Bob qui Trolle
cedric wrote:
Pascal Bourguignon wrote:

Ça simplifie beaucoup de choses: tous les objets manipulables dans le
système sont accessibles (ou non, selon les droits d'accès) dans la
hierarchie de nommage. Enfin presque tous, il y en a qui ne
comprennent rien et qui créent dans le système des objets non
accessibles...



Comme les interfaces réseaux par exemple ?


Les bus sont rarement accessibles tels quels en tant qu'objets du
système, sauf s'ils sont point à point par nature (quel qu'en soit la
vocation effective runtime). /proc/ide n'est généralement pas une
interface, par exemple, mais /proc/ide/xxx l'est. Idem pour
/proc/net/xxx. Mais rien n'empêche qui que ce soit de créer un driver
pour ça, lequel peut être rendu accessible par le biais d'un pilota dédié.

La durée de vie d'un objet du noyau détermine également le coût effectif
d'exporter une interface fichier à cet objet. Exporter /proc/ide/hd$N
est normalement viable, si on considère qu'une partition d'un disque IDE
est supposées, une fois créée, exister un certain temps : exporter par
principe une interface fichier sur toute socket créée plus discutable.


Avatar
Stephane Chazelas
2004-10-28, 22:28(+02), Pascal Bourguignon:
[...]
3/ Quelle est la taille limite d'un argument que je peux passer en paramètre
à un programme ?


Ça dépend du noyeau et du shell.


Ca ne depend pas du shell en principe (sauf peut-etre pour de
vieilles versions de csh). Les shells alloue la place pour les
arguments dynamiquement, donc la limite au niveau du shell est
celle de la memoire disponible.

(est-ce que je peux lancer un programme nomprog prenant une chaine de
caractères de 100000 caractères par exemple ?)


En la prenant comment? Par devant ou par derrière?

En général, en argument: non.


Sous Solaris 8, la limite est de l'ordre du mega octet. Il me
semble que sous Linux, c'est de l'ordre de 130k.

Donc, au moins sur ces deux systemes, ca devrait passer (a moins
que argv[0] ou l'environnement soit gros aussi).

--
Stephane


Avatar
Pascal Bourguignon
cedric writes:

Pascal Bourguignon wrote:
Ça simplifie beaucoup de choses: tous les objets manipulables dans le
système sont accessibles (ou non, selon les droits d'accès) dans la
hierarchie de nommage. Enfin presque tous, il y en a qui ne
comprennent rien et qui créent dans le système des objets non
accessibles...


Comme les interfaces réseaux par exemple ?


Heureusement bash palie à ce manque et on peut ouvrir dans bash des
fichiers speciaux virtuels comme /dev/tcp/$host/$port

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

Voting Democrat or Republican is like choosing a cabin in the Titanic.


Avatar
Rakotomandimby Mihamina
On Fri, 29 Oct 2004 18:45:00 +0200, Pascal Bourguignon wrote:
Heureusement bash palie à ce manque et on peut ouvrir dans bash des
fichiers speciaux virtuels comme /dev/tcp/$host/$port


Waaaaaaaw! C'est vrai ?
Comment faut-il configurer $host pour qu'il fasse ça ?

C'est un peu comme en mode graphique et dans un environnement mixte (avec
du MSwin) et samba on peut avoir un genre de "voisinage réseau" ?

--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)

Avatar
Pascal Bourguignon
Rakotomandimby Mihamina writes:

On Fri, 29 Oct 2004 18:45:00 +0200, Pascal Bourguignon wrote:
Heureusement bash palie à ce manque et on peut ouvrir dans bash des
fichiers speciaux virtuels comme /dev/tcp/$host/$port


Waaaaaaaw! C'est vrai ?
Comment faut-il configurer $host pour qu'il fasse ça ?


( echo "GET http://www.google.com/ HTTP/1.1" 1>&3 ;
echo "" 1>&3 ; cat 0<&3 ) 3<> /dev/tcp/www.google.com/80

C'est un peu comme en mode graphique et dans un environnement mixte (avec
du MSwin) et samba on peut avoir un genre de "voisinage réseau" ?


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

Voting Democrat or Republican is like choosing a cabin in the Titanic.


Avatar
Jean-Yves LENHOF
Le Thu, 28 Oct 2004 20:15:21 +0200, Fred S a écrit :

Je suis en ksh même si je pense que ça n'a pas d'importance ici

1/ Pourquoi ceci ne marche pas :
echo nomfichier | xargs vi


Ca peut dépendre du vi utilisé... le mien n'est pas content :


:~$ echo toto|xargs vi
ex/vi: Vi's standard input and output must be a terminal
:~$

Avatar
Pascal Bourguignon
Rakotomandimby Mihamina writes:

On Fri, 29 Oct 2004 18:45:00 +0200, Pascal Bourguignon wrote:
Heureusement bash palie à ce manque et on peut ouvrir dans bash des
fichiers speciaux virtuels comme /dev/tcp/$host/$port


Waaaaaaaw! C'est vrai ?
Comment faut-il configurer $host pour qu'il fasse ça ?

C'est un peu comme en mode graphique et dans un environnement mixte (avec
du MSwin) et samba on peut avoir un genre de "voisinage réseau" ?


( echo "GET http://www.google.com/search?NeXTSTEP" ; cat ) <> /dev/tcp/www.google.com/80

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

Voting Democrat or Republican is like choosing a cabin in the Titanic.