OVH Cloud OVH Cloud

Syntaxe d'un pipe avec une commande a arguments

29 réponses
Avatar
Frederic
Bonjour,

je voudrai réaliser l'opération suivante : j'ai une commande que je nommerai
ma_commande qui me retourne un chemin absolu (/home/user/fred par exemple). Je
voudrai copier le contenu de ce répertoire dans le répertoire "toto". Mon idée
est quelque chose comme ça :

ma_commande | cp $1 toto

mais ce système avec $1 ne fonctionne pas. Comment faire pour appeler le
résultat de "ma_commande" avec cp ?

Voilà, en espérant avoir été clair

Fred.
--
Ce message a été posté via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr

http://forums.club-internet.fr/

10 réponses

1 2 3
Avatar
DINH Viêt Hoà

je voudrai réaliser l'opération suivante : j'ai une commande que je nommerai
ma_commande qui me retourne un chemin absolu (/home/user/fred par exemple). Je
voudrai copier le contenu de ce répertoire dans le répertoire "toto". Mon idée
est quelque chose comme ça :


cp "`ma_commande`"/* toto

--
DINH V. Hoa,

"Ma tuxitude me beastifie" -- sunZ

Avatar
Stephane CHAZELAS
Le 14 Oct 2003 09:33:47 GMT, Frederic écrivait :
[...]
je voudrai réaliser l'opération suivante : j'ai une commande que je nommerai
ma_commande qui me retourne un chemin absolu (/home/user/fred par exemple). Je
voudrai copier le contenu de ce répertoire dans le répertoire "toto". Mon idée
est quelque chose comme ça :

ma_commande | cp $1 toto


Vois du coté de xargs(1). Le "|" c'est pour connecter une sortie
standard à une entree standard, pas pour passer des arguments
sur la ligne de commande, xargs fait la conversion entre ces
deux modes de communication inter-commandes.

Tu peux aussi faire:

cp -- "$(ma_commande)" toto

ou
cp -- "`ma_commande`" toto
si tu as un shell très ancien.

Ça utilise aussi un pipe(2) internalement, c'est le shell qui
lit l'autre bout du pipe et fait un argument à cp de ce qu'il a
lu.

--
Stéphane

Avatar
Jean-Marc Bourguet
Frederic writes:

ma_commande | cp $1 toto


Pour tout les shells
cp `ma_commande` toto

Alternative pour les bournes pas trop antiques
cp $(ma_commande) toto

A+

--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Stephane CHAZELAS
Le 14 Oct 2003 11:50:19 +0200, Jean-Marc Bourguet écrivait :
Frederic writes:

ma_commande | cp $1 toto


Pour tout les shells
cp `ma_commande` toto


Note qu'au contraire de cp "`ma_commande`" toto
le shell accomplit des taches supplémentaires. Après avoir
obtenu le résultat de ma_commande, il le découpe (suivant IFS
[word splitting]) et genère des noms de fichiers à partir des
wildcard contenus dans les bouts découpés).

IFS=:
cp `echo '*.txt:*.html'` toto
copie les fichiers texte et html du répertoire courant dans
toto.

cp "`echo '*.txt:*.html'`" toto
copie le fichier html "*.txt:*.html" vers "toto".

Par défaut, IFS contient tous les charactères blancs.

Alternative pour les bournes pas trop antiques
cp $(ma_commande) toto


Si le shell reconnait $(...), alors ce n'est pas un shell
Bourne, un shell Bourne-like, certes, mais pas un shell Bourne.

On ne trouve guère plus de shells Bourne en tant que /bin/sh de
nos jours, à part sur Solaris où il est préférable d'utiliser
/usr/xpg4/bin/sh qui est un shell POSIX comme la plupart des
/bin/sh des unix récents.

--
Stéphane


Avatar
Jean-Marc Bourguet
Stephane CHAZELAS writes:

On ne trouve guère plus de shells Bourne en tant que /bin/sh de nos
jours, à part sur Solaris où il est préférable d'utiliser
/usr/xpg4/bin/sh qui est un shell POSIX comme la plupart des /bin/sh
des unix récents.


Petite question, est qu'il y a un moyen simple de faire un script
raisonnablement portable -- disons Solaris, HP-UX, AIX, Linux
recent -- qui depende de fonctionnalite POSIX a part l'utilisation
d'un wrapper du genre

oldPath=$PATH
PATH=`getconf PATH`
export PATH
shell=`which sh`
PATH=$oldPath
export PATH
exec "$shell" "$0.sh" "$@"

A+

--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Laurent Wacrenier
Jean-Marc Bourguet écrit:
Petite question, est qu'il y a un moyen simple de faire un script
raisonnablement portable -- disons Solaris, HP-UX, AIX, Linux
recent -- qui depende de fonctionnalite POSIX a part l'utilisation
d'un wrapper du genre


On peut utiliser "command -p" pour executer une commande avec le PATH
contenant les utilitaires standards.

oldPath=$PATH
PATH=`getconf PATH`
export PATH
shell=`which sh`
PATH=$oldPath


c'est lourd,

shell=`PATH='getconf PATH' which sh`

Au passage, which n'est pas POSIX.

export PATH


inutile de faire export après chaque affectation

exec "$shell" "$0.sh" "$@"


La norme donne l'exemple suivant pour rechercher le shell POSIX :

#
# Get list of paths to check
#
Sifs=$IFS
IFS=:
set $(getconf PATH)
IFS=$Sifs
#
# Check each path for 'sh'
#
for i in $@
do
if [ -f ${i}/sh ];
then
Pshell=${i}/sh
fi
done

Avatar
Stephane CHAZELAS
Le 14 Oct 2003 14:57:08 +0200, Jean-Marc Bourguet écrivait :
Stephane CHAZELAS writes:

On ne trouve guère plus de shells Bourne en tant que /bin/sh de nos
jours, à part sur Solaris où il est préférable d'utiliser
/usr/xpg4/bin/sh qui est un shell POSIX comme la plupart des /bin/sh
des unix récents.


Petite question, est qu'il y a un moyen simple de faire un script
raisonnablement portable -- disons Solaris, HP-UX, AIX, Linux
recent -- qui depende de fonctionnalite POSIX a part l'utilisation
d'un wrapper du genre

oldPath=$PATH
PATH=`getconf PATH`


Et encore, qui te dit que tu as là le "getconf" du système,
POSIX n'a pas standardisé le chemin du getconf qui te permet de
connaitre le chemin des autres commandes...

export PATH
shell=`which sh`


De préférence, ne pas utiliser "which", faut se coltiner la
recherche du PATH à la main.

PATH=$oldPath
export PATH
exec "$shell" "$0.sh" "$@"


Eh non, rien de beaucoup plus simple que ça, et c'est là que
Solaris fait ch***.

On peut se contenter d'un header comme wrapper:

:
if test "x$0-$$" != "x$SKIP_WRAP"; then
SKIP_WRAP=$0-$$ export SKIP_WRAP
for sh in /usr/xpg4/bin /usr/posix/bin /bin /usr/bin; do
test -x "$sh/sh" && exec "$sh/sh" "$0" ${1+"$@"}
done
fi

# le script

--
Stéphane


Avatar
Stephane CHAZELAS
Le Tue, 14 Oct 2003 13:24:16 +0000 (UTC), Laurent Wacrenier écrivait :
[...]
shell=`PATH='getconf PATH' which sh`


shell=`PATH=`getconf PATH` which sh`
encore faut-il avoir le bon getconf.

Au passage, which n'est pas POSIX.

export PATH


inutile de faire export après chaque affectation


Avec certains Bourne shells, si.

La norme donne l'exemple suivant pour rechercher le shell POSIX :

#
# Get list of paths to check
#
Sifs=$IFS
IFS=:
set $(getconf PATH)


On perd les arguments et ce n'est pas une syntaxe Bourne, à quoi
bon.

IFS=$Sifs
#
# Check each path for 'sh'
#
for i in $@
do
if [ -f ${i}/sh ];
then
Pshell=${i}/sh
fi
done


??? Ça retourne le dernier "sh" dans le PATH au lieu du
premier.

J'aurais plutot fait:

Sifs=$IFS
${IFS+:} unset Sifs
IFS=:
for i in `getconf PATH`
do
Pshell=$i/sh
[ -x "$Pshell" ] && break
done
IFS=$Sifs
${Sifs+:} unset IFS

(pas testé)
--
Stéphane


Avatar
Stephane CHAZELAS
Le 14 Oct 2003 14:15:55 GMT, Stephane CHAZELAS écrivait :
[...]
inutile de faire export après chaque affectation


Avec certains Bourne shells, si.
[...]


Il se pourrait meme que ce soit pour tous les Bourne shells:
http://www.in-ulm.de/~mascheck/bourne/common.html

--
Stéphane


Avatar
Jean-Marc Bourguet
Laurent Wacrenier <lwa@ teaser . fr> writes:

Jean-Marc Bourguet écrit:
Petite question, est qu'il y a un moyen simple de faire un script
raisonnablement portable -- disons Solaris, HP-UX, AIX, Linux
recent -- qui depende de fonctionnalite POSIX a part l'utilisation
d'un wrapper du genre


On peut utiliser "command -p" pour executer une commande avec le PATH
contenant les utilitaires standards.

oldPath=$PATH
PATH=`getconf PATH`
export PATH
shell=`which sh`
PATH=$oldPath


c'est lourd,

shell=`PATH='getconf PATH' which sh`

Au passage, which n'est pas POSIX.

export PATH


inutile de faire export après chaque affectation

exec "$shell" "$0.sh" "$@"


La norme donne l'exemple suivant pour rechercher le shell POSIX :

#
# Get list of paths to check
#
Sifs=$IFS
IFS=:
set $(getconf PATH)
IFS=$Sifs
#
# Check each path for 'sh'
#
for i in $@
do
if [ -f ${i}/sh ];
then
Pshell=${i}/sh
fi
done


Si on ne veut pas deux fichiers, on arrive donc a

if [ "X$1" != "X-inPosixShell" ] ; then
Sifs=$IFS
IFS=:
Pshell=""
for i in `command -p getconf PATH` ; do
if [ -x "${i}/sh" ] ; then
Pshell=${i}/sh
break
fi
done
IFS=$Sifs
if [ "X$Pshell" != "X" ] ; then
exec "$Pshell" -- "$0" -inPosixShell "$@"
fi
unset -v Sifs Pshell
fi


if [ "$1" = "-inPosixShell" ] ; then
shift
fi

A+

--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org


1 2 3