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

exécuter commande bash

12 réponses
Avatar
seb
Bonjour,

Dans un script bash je construis une chaine de caractères de cette forme:
COMMAND="find /mon/chemin -maxdepth 2 -user xxx -group yyy -print -exec
chown aaa:bbb {} \;"

Quand j'exécute cette commande j'ai probablement un problème de guillemets
dans ma chaine de caractères mais je n'arrive pas à mettre le doigt dessus.
J'obtiens l'erreur suivante:
find: missing argument to `-exec'

Comment exécuter cette chaine ?

seb

10 réponses

1 2
Avatar
Pascal Bourguignon
"seb" writes:

Bonjour,

Dans un script bash je construis une chaine de caractères de cette forme:
COMMAND="find /mon/chemin -maxdepth 2 -user xxx -group yyy -print -exec
chown aaa:bbb {} ;"

Quand j'exécute cette commande j'ai probablement un problème de guillemets
dans ma chaine de caractères mais je n'arrive pas à mettre le doigt dessus.
J'obtiens l'erreur suivante:
find: missing argument to `-exec'

Comment exécuter cette chaine ?


L'anti-slash est inutile si on met la commande entre (doubles) quotes.

COMMAND="find /mon/chemin -maxdepth 2 -user xxx -group yyy -print -exec chown aaa:bbb {} ;"
echo $COMMAND
$COMMAND


--
__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.

Avatar
seb
"Pascal Bourguignon" a écrit dans le message de
news:
COMMAND="find /mon/chemin -maxdepth 2 -user xxx -group yyy -print -exec
chown aaa:bbb {} ;"


Merci,
Comme la commande marchait j'avais plutot tendance à penser qu'il fallait
protéger un caractère plutot qu'en enlever un.
Dire que j'ai essayer pendant plus d'1 heure...

Pendant que je suis là, existe-t-il un moyen simple de récupérer le nom du
propriétaire d'uun fichier ?
Là je suis parti sur un ls -l mais il doit y avoir plus simple.

seb

Avatar
Rakotomandimby Mihamina
seb wrote:
Là je suis parti sur un ls -l mais il doit y avoir plus simple.


'ls -l' et recuperer la colonne qu'il faut avec awk.
Si c'est la premiere colonne que tu veux recuperer ca serait :
ls -l fichier | awk '{pint $1}'
--
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
"seb" writes:

"Pascal Bourguignon" a écrit dans le message de
news:
COMMAND="find /mon/chemin -maxdepth 2 -user xxx -group yyy -print -exec
chown aaa:bbb {} ;"


Merci,
Comme la commande marchait j'avais plutot tendance à penser qu'il fallait
protéger un caractère plutot qu'en enlever un.
Dire que j'ai essayer pendant plus d'1 heure...

Pendant que je suis là, existe-t-il un moyen simple de récupérer le nom du
propriétaire d'uun fichier ?
Là je suis parti sur un ls -l mais il doit y avoir plus simple.


man stat

--
__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.


Avatar
TiChou
Dans le message <news:ci4ldc$ed1$,
*seb* tapota sur f.c.o.unix :

Pendant que je suis là, existe-t-il un moyen simple de récupérer le nom du
propriétaire d'uun fichier ?
Là je suis parti sur un ls -l mais il doit y avoir plus simple.


Comme vous avez maladroitement reposé cette question sur
f.c.o.l.configuration, je suppose donc que votre système est Linux et donc
je donnerai une réponse avec l'utilisation des outils GNU disponible
généralement par défaut sur cet OS.

Une façon directe :

$ stat -c %U votre_fichier

Une façon indirecte :

$ find votre_fichier -printf "%un"

Avec perl :

$ perl -e '$uid = (stat("votre_fichier"))[4];
$user = (getpwuid($uid))[0];
print "$usern"'

--
TiChou

Avatar
Stephane Chazelas
2004-09-13, 17:08(+02), seb:
Dans un script bash je construis une chaine de caractères de cette forme:
COMMAND="find /mon/chemin -maxdepth 2 -user xxx -group yyy -print -exec
chown aaa:bbb {} ;"

Quand j'exécute cette commande j'ai probablement un problème de guillemets
dans ma chaine de caractères mais je n'arrive pas à mettre le doigt dessus.
J'obtiens l'erreur suivante:
find: missing argument to `-exec'

Comment exécuter cette chaine ?
[...]


Soit:

COMMAND="find /mon/chemin -maxdepth 2 -user xxx -group yyy
-print -exec chemin aaa:bbb {} ;"
eval "$COMMAND"

soit:

COMMAND() {
find /mon/chemin -maxdepth 2 -user xxx -group yyy
-print -exec chemin aaa:bbb {} ;
}

soit:

COMMAND=(find /mon/chemin -maxdepth 2 -user xxx -group yyy
-print -exec chemin aaa:bbb {} ;)
"${COMMAND[@]}"

soit:

COMMAND="find|/mon/chemin|-maxdepth|2|-user|xxx|-group|yyy|
-print|-exec|chemin|aaa:bbb|{}|;"
IFS='|'
set -f
$COMMAND

On peut laisser IFS tel quel et separer les arguments par des
espaces des tabulations ou des sauts de lignes, mais utiliser un
autre caractere mais bien en evidence que c'est le mechanisme de
word-splitting qui est en jeu et que cette commande n'est pas
lue comme une ligne de commande du script.

(noter que maxdepth est GNU specific).

--
Stephane

Avatar
Remi Moyen
On Mon, 13 Sep 2004, Rakotomandimby Mihamina wrote:

Là je suis parti sur un ls -l mais il doit y avoir plus simple.


'ls -l' et recuperer la colonne qu'il faut avec awk.
Si c'est la premiere colonne que tu veux recuperer ca serait :
ls -l fichier | awk '{pint $1}'


Tiens, au passage, une question naïve de ma part. C'est pas une critique
de la programmation proposée, mais juste une question vraiment innocente :

Pourquoi, pour faire ce genre d'opérations (sélectionner un champ dans une
ligne, en général), on voit très souvent utiliser awk, comme ici, et
quasiment jamais cut ? Pourtant, dans l'exemple ici, un cut -d ' ' -f 1
(euh, -f 3 pour un ls -l en fait) donnerait la même chose, non ?

Est-ce uniquement parce que, pour des traitements plus compliqués, cut est
bien évidemment dans les choux là où awk est à l'aise, ou y'a-t-il une
autre raison profonde ?
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."


Avatar
Stephane Chazelas
2004-09-14, 09:34(+02), Remi Moyen:
On Mon, 13 Sep 2004, Rakotomandimby Mihamina wrote:

Là je suis parti sur un ls -l mais il doit y avoir plus simple.


'ls -l' et recuperer la colonne qu'il faut avec awk.
Si c'est la premiere colonne que tu veux recuperer ca serait :
ls -l fichier | awk '{pint $1}'


Tiens, au passage, une question naïve de ma part. C'est pas une critique
de la programmation proposée, mais juste une question vraiment innocente :

Pourquoi, pour faire ce genre d'opérations (sélectionner un champ dans une
ligne, en général), on voit très souvent utiliser awk, comme ici, et
quasiment jamais cut ? Pourtant, dans l'exemple ici, un cut -d ' ' -f 1
(euh, -f 3 pour un ls -l en fait) donnerait la même chose, non ?

Est-ce uniquement parce que, pour des traitements plus compliqués, cut est
bien évidemment dans les choux là où awk est à l'aise, ou y'a-t-il une
autre raison profonde ?



pour cut dans:

" a b c"

les champs sont "", "a", "", "b", "c" (une espace separe deux
champs).

pour awk: "a", "b", "c" (une serie d'espaces separe deux champs
et les espaces au debut et a la fin sont ignorés).

Meme en preprocessant avec un tr -s " ", pour cut ca devient:
"", "a", "b", "c".

--
Stephane



Avatar
Pascal Bourguignon
Remi Moyen writes:
Pourquoi, pour faire ce genre d'opérations (sélectionner un champ dans
une ligne, en général), on voit très souvent utiliser awk, comme ici,
et quasiment jamais cut ? Pourtant, dans l'exemple ici, un cut -d ' '
-f 1 (euh, -f 3 pour un ls -l en fait) donnerait la même chose, non ?

Est-ce uniquement parce que, pour des traitements plus compliqués, cut
est bien évidemment dans les choux là où awk est à l'aise, ou y'a-t-il
une autre raison profonde ?


Dans mon cas, c'est parce que je sais me servir de awk, mais pas de
cut, et comme awk sait faire tout ce que sait faire cut, je ne vois
pas de raison de perdre mon temps avec man cut...

--
__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.

Avatar
Stephane Chazelas
2004-09-14, 12:59(+00), Pascal Bourguignon:
[...]
Dans mon cas, c'est parce que je sais me servir de awk, mais pas de
cut, et comme awk sait faire tout ce que sait faire cut, je ne vois
pas de raison de perdre mon temps avec man cut...


Pas tous les awk. Le vieux awk ne sait pas faire de decoupage à
la cut avec des espaces (on peut l'implementer a la main en
utilisant substr et index mais ca devient fastidieux) (avec le
nouveau awk, on peut utiliser awk -F '[ ]'). Certaines
implementations de awk souffrent aussi de certaines limitations
(nombre de champs, longueur des lignes...)

--
Stephane

1 2