cerhu > comp.os.* > comp.os.unix

Olivier Miakinen (22/06/2017, 21h12)
Bonjour,

Supposons que je veuille envoyer le signal 1 au processus
dont le pid se trouve dans le fichier foobar.

La première idée qui me vient à l'esprit est :
kill -1 $(cat foobar)

Ma question : s'agit-il d'un UUOC (useless use of cat) ?
En d'autres termes, existe-t-il un moyen plus simple de
passer le contenu d'un (unique) fichier comme paramètres
d'une commande, sans utiliser cat ?
Nicolas George (22/06/2017, 21h21)
Olivier Miakinen , dans le message <oih4rj$je4$1>,
a écrit :
> Supposons que je veuille envoyer le signal 1 au processus
> dont le pid se trouve dans le fichier foobar.
> La première idée qui me vient à l'esprit est :
> kill -1 $(cat foobar)
> Ma question : s'agit-il d'un UUOC (useless use of cat) ?
> En d'autres termes, existe-t-il un moyen plus simple de
> passer le contenu d'un (unique) fichier comme paramètres
> d'une commande, sans utiliser cat ?


S'il n'y a qu'une ligne, tu peux la lire avec read :

read -r line < file

S'il y a plusieurs lignes, tu peux faire une boucle :

lf="
"
lines=""
while read -r line; do
lines="$lines$line$lf"
done < file
Erwan David (22/06/2017, 22h37)
Olivier Miakinen <om+news> écrivait :

> Bonjour,
> Supposons que je veuille envoyer le signal 1 au processus
> dont le pid se trouve dans le fichier foobar.
> La première idée qui me vient à l'esprit est :
> kill -1 $(cat foobar)
> Ma question : s'agit-il d'un UUOC (useless use of cat) ?
> En d'autres termes, existe-t-il un moyen plus simple de
> passer le contenu d'un (unique) fichier comme paramètres
> d'une commande, sans utiliser cat ?


kill -1 $(< foobar)

Il me semble que c'est une syntaxe POSIX.
Pascal J. Bourguignon (23/06/2017, 01h59)
Olivier Miakinen <om+news> writes:

> Bonjour,
> Supposons que je veuille envoyer le signal 1 au processus
> dont le pid se trouve dans le fichier foobar.
> La première idée qui me vient à l'esprit est :
> kill -1 $(cat foobar)
> Ma question : s'agit-il d'un UUOC (useless use of cat) ?


Je dirais que non.

> En d'autres termes, existe-t-il un moyen plus simple de
> passer le contenu d'un (unique) fichier comme paramètres
> d'une commande, sans utiliser cat ?


Oui, avec bash c'est possible:

kill -1 $<(foobar)

Mais pas avec sh.
Pour les autres shell, je ne sais pas.

Pour d'autres commands que kill, ça va dépendre de la commande:
certaines commandes sont capables de prendre leur données à partir d'un
fichier passé en argument. Par exemple, un mot de passe à passerà gpg
peut se faire avec l'une de ces trois options:

--passphrase-fd n
--passphrase-file file
--passphrase string

Alors on a le choix entre:

gpg --passphrase-file foobar ?
gpg --passphrase-fd 4 4<foobar ?
gpg --passphrase "$(cat foobar)" ?

La première option est la meilleure, bien sur (portable, sure); la
seconde va dépendre du shell (possible en bash, ou quand on appelle gpg
à partir de son propre programme); la dernière est bien sûr la pire,
dans le cas d'un mot de passe, et du fait de l'existence des autres
options, peut être considérée un UUOC.

Le vrai UUOC c'est:

cat foo | mycommand

au lieu de:

mycommand < foo
Lucas Levrel (23/06/2017, 11h44)
Le 23 juin 2017, à 01:59, Pascal J. Bourguignon a écrit :
>> En d'autres termes, existe-t-il un moyen plus simple de
>> passer le contenu d'un (unique) fichier comme paramètres
>> d'une commande, sans utiliser cat ?

> Oui, avec bash c'est possible:
> kill -1 $<(foobar)
> Mais pas avec sh.
> Pour les autres shell, je ne sais pas.


Le 22 juin 2017, à 22:37, Erwan David a écrit :
> kill -1 $(< foobar)
> Il me semble que c'est une syntaxe POSIX.


Apparemment il y a débat ! Ou bien les deux sont vrais ?
Erwan David (23/06/2017, 12h20)
Lucas Levrel <lucas.levrel> écrivait :

> Le 23 juin 2017, à 01:59, Pascal J. Bourguignon a écrit :
> Le 22 juin 2017, à 22:37, Erwan David a écrit :
> Apparemment il y a débat ! Ou bien les deux sont vrais ?


@bibi:~ $ echo $(< /run/cups/cupsd.pid)
4870
@bibi:~ $ echo $<( /run/cups/cupsd.pid)
$/dev/fd/63
bash: /run/cups/cupsd.pid: Permission denied

ça marche en bash ou zsh, pas en sh
Pascal J. Bourguignon (23/06/2017, 16h09)
Lucas Levrel <lucas.levrel> writes:

> Le 23 juin 2017, à 01:59, Pascal J. Bourguignon a écrit :
>>> En d'autres termes, existe-t-il un moyen plus simple de
>>> passer le contenu d'un (unique) fichier comme paramètres
>>> d'une commande, sans utiliser cat ?

>> Oui, avec bash c'est possible:
>> kill -1 $<(foobar)


Oops, c'est n'importe quoi, désolé.

Je pensais à <(list), mais ça prend des commandes, pas un fichier,
alors, il faudrait faire:

kill -1 <(cat foobar)

ce qui n'est pas mieux.
[..]
Nicolas George (23/06/2017, 16h43)
"Pascal J. Bourguignon" , dans le message <m2tw363idr.fsf>,
a écrit :
> Je pensais à <(list), mais ça prend des commandes, pas un fichier,
> alors, il faudrait faire:
> kill -1 <(cat foobar)


Non, tu te trompes complètement sur la sémantique de <(...).

Ne surtout pas essayer cette commande avec les privilèges de root.
Nicolas George (23/06/2017, 16h43)
"Pascal J. Bourguignon" , dans le message <m2tw363idr.fsf>,
a écrit :
> Je pensais à <(list), mais ça prend des commandes, pas un fichier,
> alors, il faudrait faire:
> kill -1 <(cat foobar)


Non, tu te trompes complètement sur la sémantique de <(...).

Ne surtout pas essayer cette commande avec les privilèges de root.
.... Hum, à la réflexion, pas de problème, ça fera juste une erreur sans
gravité.
Pascal J. Bourguignon (23/06/2017, 19h17)
Nicolas George <nicolas$george> writes:

> "Pascal J. Bourguignon" , dans le message <m2tw363idr.fsf>,
> a écrit :
> Non, tu te trompes complètement sur la sémantique de <(...).
> Ne surtout pas essayer cette commande avec les privilèges de root.
> ... Hum, à la réflexion, pas de problème, ça fera juste une erreur sans
> gravité.


Il faudrait une option: kill -1 --pid-in-file <(cat foobar)
ce qui serait équivalent à: kill -1 --pid-in-file foobar
donc doublement inutile :-)
Nicolas George (23/06/2017, 19h20)
"Pascal J. Bourguignon" , dans le message <m2lgoi39p3.fsf>,
a écrit :
> Il faudrait une option


Non, ce serait une entorse au principe KISS.
Olivier Miakinen (23/06/2017, 22h57)
Le 22/06/2017 21:21, Nicolas George m'a répondu :
> read -r line < file
> S'il y a plusieurs lignes, tu peux faire une boucle :
> lf="
> "
> lines=""
> while read -r line; do
> lines="$lines$line$lf"
> done < file


Certes, mais tu ne réponds pas à la question posée, mais à une
question que je n'ai pas posée. ;-)

Alors bien sûr on peut toujours compléter ta réponse par un
« kill -1 $lines », mais là il s'agit d'un UUOS (useless use
of script) !
Olivier Miakinen (23/06/2017, 23h03)
Le 22/06/2017 22:37, Erwan David a écrit :
> kill -1 $(< foobar)
> Il me semble que c'est une syntaxe POSIX.


Je ne connaissais pas. Ça fonctionne dans bash mais pas avec sh.
Olivier Miakinen (23/06/2017, 23h10)
Le 23/06/2017 01:59, Pascal J. Bourguignon a écrit :
>> La première idée qui me vient à l'esprit est :
>> kill -1 $(cat foobar)
>> Ma question : s'agit-il d'un UUOC (useless use of cat) ?

> Je dirais que non.


Ok.

> [...]
> Pour d'autres commands que kill, ça va dépendre de la commande:


En effet, et comme tu le rappelais à la fin de ta réponse l'UUOC typique
concerne une commande qui accepte ses paramètres de stdin. Ce n'est pas
le cas de kill, d'où ma question.

[..]
> à partir de son propre programme); la dernière est bien sûr la pire,
> dans le cas d'un mot de passe, et du fait de l'existence des autres
> options, peut être considérée un UUOC.


Oui, et merci du rappel de la syntaxe « 4<foobar » dont j'ai déjà eu
besoin un jour même si c'était un cas assez particulier.
Olivier Miakinen (23/06/2017, 23h16)
Le 22/06/2017 21:12, j'écrivais :
> kill -1 $(cat foobar)
> Ma question : s'agit-il d'un UUOC (useless use of cat) ?


Merci à tous pour vos réponses, je vais donc conserver cette syntaxe.

Par ailleurs, je suis heureux de constater que le groupe de discussion
fr.comp.os.linux, même s'il peut n'avoir aucune activité que du spam
pendant de longs mois d'affilée, est toujours suivi par les gourous
qui interviennent aussitôt lorsqu'une vraie question est posée. :-)

Discussions similaires
UUOC ?


Fuseau horaire GMT +2. Il est actuellement 12h21. | Privacy Policy