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

Est-ce un UUOC ?

17 réponses
Avatar
Olivier Miakinen
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 ?

--
Olivier Miakinen

10 réponses

1 2
Avatar
Nicolas George
Olivier Miakinen , dans le message <oih4rj$je4$,
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
Avatar
Erwan David
Olivier Miakinen <om+ é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.
--
Les simplifications c'est trop compliqué
Avatar
Pascal J. Bourguignon
Olivier Miakinen <om+ 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 à parti r 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
--
__Pascal J. Bourguignon
http://www.informatimago.com
Avatar
Lucas Levrel
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 ?
--
LL
Ἕν οἶδα ὅτι οὐδὲν οἶδα (Σωκράτης)
Avatar
Erwan David
Lucas Levrel écrivait :
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 ?

@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
--
Les simplifications c'est trop compliqué
Avatar
Pascal J. Bourguignon
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.
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 ?

--
__Pascal J. Bourguignon
http://www.informatimago.com
Avatar
Nicolas George
"Pascal J. Bourguignon" , dans le message ,
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.
Avatar
Nicolas George
"Pascal J. Bourguignon" , dans le message ,
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é.
Avatar
Pascal J. Bourguignon
Nicolas George <nicolas$ writes:
"Pascal J. Bourguignon" , dans le message ,
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é.

Il faudrait une option: kill -1 --pid-in-file <(cat foobar)
ce qui serait équivalent à: kill -1 --pid-in-file foobar
donc doublement inutile :-)
--
__Pascal J. Bourguignon
http://www.informatimago.com
Avatar
Nicolas George
"Pascal J. Bourguignon" , dans le message ,
a écrit :
Il faudrait une option

Non, ce serait une entorse au principe KISS.
1 2