66 votes

xargs ne reconnaît pas les alias bash

J'essaie d'exécuter la commande suivante:

 find . -iname '.#*' -print0 | xargs -0 -L 1 foobar
 

où "foobar" est un alias ou une fonction défini dans mon fichier .bashrc (dans mon cas, c'est une fonction qui prend un paramètre). Apparemment, xargs ne les reconnaît pas comme des choses qu'il peut exécuter. Y a-t-il un moyen astucieux de remédier à cela?

38voto

ephemient Points 87003

Depuis seulement votre shell interactif sait sur les alias, pourquoi ne pas simplement lancer l'alias sans bifurquer par xargs?

find . -iname '.#*' -print0 | while read -r -d '' i; do foobar "$i"; done

Si vous êtes sûr que vos noms de fichiers n'ont pas de retours à la ligne dans les (ick, pourquoi le feraient-ils?), vous pouvez simplifier cette à

find . -iname '.#*' -print | while read -r i; do foobar "$i"; done

ou même juste find -iname '.#*' | ..., depuis le répertoire par défaut est . et l'action par défaut est -print.

Une autre solution de rechange:

 IFS=$'\n'; for i in `find -iname '.#*'`; do foobar "$i"; done

dire Bash que les mots ne sont que diviser sur les retours à la ligne (par défaut: IFS=$' \t\n'). Vous devez être prudent avec cela, bien que certains scripts ne pas faire face à un changement de l' $IFS.

11voto

tilo Points 21

En utilisant Bash, vous pouvez également spécifier le nombre d'arguments transmis à votre alias (ou fonction) de la manière suivante:

 alias myFuncOrAlias='echo'  # alias defined in your ~/.bashrc, ~/.profile, ...
echo arg1 arg2 | xargs -n 1 bash -cil 'myFuncOrAlias "$1"' arg0
echo arg1 arg2 | xargs  bash -cil 'myFuncOrAlias "$@"' arg0
 

6voto

Alnitak Points 143355

Cela ne marche pas, xargs s'attend à être en mesure d' exec le programme donné en paramètre.

Depuis foobar dans votre cas est juste un bash d'alias ou de fonction il n'y a pas de programme à exécuter.

Bien qu'il s'agit de commencer bash pour chaque fichier renvoyé par find, vous pouvez écrire un petit script shell ainsi:

#!/bin/bash
. $(HOME)/.bashrc
func $*

et puis passer le nom de ce script en tant que paramètre d' xargs

1voto

Staale Points 8795

J'utilise habituellement trouver comme ceci:

 find . -iname '' -exec cmd '{}' \;
 

'{}' sera remplacé par le nom du fichier et \; est nécessaire pour terminer la chaîne d'exécution. Cependant, si cela ne fonctionne pas avec votre fonction, vous devrez peut-être l'exécuter via bash:

 find .. |sed -e "s/.*/cmd '&'/"|bash
 

Find imprime chaque fichier sur une ligne, sed le préfixe avec votre commande, puis le dirige vers bash pour exécution. Passer le | bash en premier pour voir ce qui va arriver.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X