Peut xargs' délimiteur par défaut-il être changé?
Je veux le comportement suivant sans avoir à le spécifier explicitement avec les options:
xargs -d '\n'
Contrairement à la plupart des commandes, vous ne pouvez pas simplement utiliser un alias, parce que les tuyaux ne reconnaissent pas les alias (une-remarque, pourquoi est-il conçu de cette façon?). J'ai aussi essayé de créer mon propre ~/bin/xargs
script, mais je pense que ce n'est pas aussi simple que la lecture de "$@" comme une chaîne de caractères à l'intérieur du script.
Des suggestions pour rendre le délimiteur de ligne par défaut? Je ne veux pas d'obtenir un tas d'erreurs quand j'ai un espace dans le chemin d'accès (et à l'aide de find ... -print0 | xargs -0
a d'autres effets indésirables).
Mise à JOUR
Mon script shell tentative est ceci:
/usr/local/bin/xargs -d '\n' "$@"
Autant que je sache, il n'y a pas moyen de changer xargs comportement par défaut. S'il vous plaît montrer la
xargs
script-vous essayé d'écrire, si vous voulez aider à la fixation.Merci pour les suggestions. Je n'avais pas exploré la possibilité d'une fonction shell. Cela semble intéressant. Je ne suis pas en faveur de tr depuis que je pourrait tout aussi bien utiliser le flag-d. Jusqu'à présent la meilleure option pour moi, c'est d'ajouter l'option à mon xargs clé de liaison. Je vais vous montrer mon script peu de temps...
Voulez-vous savoir pourquoi shell script ne fonctionne pas? Ou êtes-vous satisfaits de l'utilisation d'une fonction shell, comme @Barmar suggère. (Je n'ai pas eu de problème de tuyauterie pour les alias. Quelle est la version de bash utilisez-vous? - ou êtes-vous à l'aide de quelques autres shell?)
Shell version: zsh 4.3.12 (i386-apple-darwin11.2.0). En fait, je crois que j'ai trouvé la sortie, je veux de l'exécution de "grep chemin/avec/les espaces machaine" mais après le résultat de la montre "grep: chemin/avec/espace: No such file or directory". Ce n'est pas un énorme problème, la plupart du temps j'utilise xargs avec un raccourci clavier. Mais c'est quelque chose qui m'a gêné pendant des années. Je ne suis pas familier avec la coquille de fonctions aimerais entendre d'autres suggestions.
OriginalL'auteur Sridhar-Sarnobat | 2013-10-06
Vous devez vous connecter pour publier un commentaire.
J'ai testé
xargs -d '\n' -n1 echo
sur la ligne de commande et il a travaillé comme annoncé; la rupture de l'entrée en lignes et en écho.Vous pourrait être mordu par les hypothèses concernant le shell de s'échapper pendant une affectation de variable. Par exemple, si votre script shell est similaire à ceci:
une erreur se produit, parce que les guillemets autour de l'ensemble de la CMD chaîne de préserver à la fois les guillemets simples et la barre oblique inverse dans le séparateur.
Si vous joignons la commande xargs à l'intérieur des guillemets, vous pouvez le changer à la suite (pas de guillemets simples)
et il sera probablement fonction que vous en avez besoin.
Testé sur CentOS 6.4, xargs version 4.4.2
OriginalL'auteur Kelvin Edmison
J'ai
~/bin
dans monPATH
et de garder un petit script avec mon préféré est par défaut accessible par tous les shells sur mon système (à plusieurs reprises, j'ai utiliser le tableau de bord, Bash, et les Poissons). Il est minuscule:Le script est appelé
x
pour éviter les conflits avec les scripts attendent à ce que la normexargs
par défaut. Si vous essayez de remplacerxargs
lui-même, que je ne recommande pas, assurez-vous que votre~/bin
apparaît plus élevée dans votre CHEMIN d'accès que le systèmexargs
.which -a xargs
me dit que la seulexargs
existe au/usr/bin/xargs
dans mon système, donc je sais que mon répertoire home,/home/stephen/bin
, doit comparaître comme suit:De toute façon, comme un script accessible par tous les programmes, cela signifie que vous pouvez faire des choses comme
find|x grep
etsh -c 'x ...'
.Si vous utilisez Bash et préfèrent un alias, vous pouvez aussi simplement utiliser:
Note de fuite d'espace pour l'expansion d'alias. Cela vous permet de la chaîne d'alias. Par exemple, si, en plus de la ci-dessus alias, j'ai eu un alias pour la commande grep appelé
g
, la suivante devrait fonctionner:La
x
/xargs
script approche ne peut pas le faire de façon efficace par elle-même.Depuis que je switch entre les coquilles et l'utilisation d'un PC pour la plupart, je garde la poignée de alias j'ai besoin aussi des scripts séparés en
~/bin
et shell agnostique alias dans un script d'aide,~/.sh_aliases
, qui est sourcé par~/.shrc
,~/.bashrc
, et~/.config/fish/config.fish
qu'ils prennent tous en charge un Bash-comme alias de la syntaxe. Si j'ai travaillé sur plusieurs Pc régulièrement, je serais probablement essayer de consolider ces en~/.bashrc
à la place.OriginalL'auteur Stephen Niedzielski
Si votre version de
xargs
ne prend pas en charge la définition d'un autre séparateur (comme sur un 2011 FreeBSD serveur...), vous pouvez utilisertr
de transformer votre délimiteurs en quelque chose dexargs
de travail. Vous pourriez avoir besoin d'utiliser un peu de traductions avant et après si votre entrée de caractères que votrexargs
considère délimiteurs (tels que les espaces) ou vous pouvez simplement les faire traduire vos séparateurs pourNULL
/0x0
et passer le-0
argumentxargs
.Voici un exemple d'utilisation de
xargs
de trouver n'importe quel fichier dans $PATH, qui pourrait être un possible shell à utiliser (la raison pour laquelle je suis ici, alors je suis venu avec une autre réponse):echo $PATH | tr ':' '\0' | xargs -0 ls | grep sh | sort
OriginalL'auteur Chinoto Vokro