Domanda Come posso usare i comandi con alias con xargs?


Ho il seguente alias nei miei .alias:

alias gi grep -i

e io voglio cercare foo case-insensitively in tutti i file che hanno la stringa bar nel loro nome:

find -name \*bar\* | xargs gi foo

Questo è quello che ottengo:

xargs: gi: No such file or directory

C'è un modo per usare alias in xargs, o devo usare la versione completa:

   find -name \*bar\* | xargs grep -i foo

Nota:  Questo è un semplice esempio. inoltre gi Ho degli alias piuttosto complicati che non riesco ad espandere manualmente così facilmente.

Modificare:  ero solito tcshquindi per favore specifica se una risposta è specifica per la shell.


23
2018-06-11 05:23


origine


risposte:


Gli alias sono specifici della shell, in questo caso, molto probabilmente bash specifici. Per eseguire un alias, è necessario eseguire bash, ma gli alias vengono caricati solo per shell interattive (più precisamente, .bashrc sarà letto solo per una shell interattiva).

bash -i esegue una shell interattiva (e sorgenti .bashrc). bash -c cmd piste cmd.

Mettili insieme: bash -ic cmd piste cmd in una shell interattiva, dove cmd può essere una funzione bash / alias definita nel tuo .bashrc.

find -name \*bar\* | xargs bash -ic gi foo

dovrebbe fare quello che vuoi

Edit: Vedo che hai taggato la domanda come "tcsh", quindi la soluzione specifica per bash non è applicabile. Con tcsh, non hai bisogno del -i, come sembra leggere .tcshrc a meno che tu non lo dia -f.

Prova questo:

find -name \*bar\* | xargs tcsh -c gi foo

Ha funzionato per i miei test di base.


24
2018-06-11 06:38



Ruota invece "gi" in uno script

ad esempio, in /home/$USER/bin/gi:

#!/bin/sh
exec /bin/grep -i "$@"

non dimenticare di contrassegnare il file eseguibile.


7
2018-06-11 05:39



Il suggerimento Qui è di evitare xargs e utilizzare un ciclo "while read" invece di xargs:

find -name \*bar\* | while read file; do gi foo "$file"; done

Vedere la risposta accettata nel link qui sopra per perfezionare gli spazi o le nuove righe nei nomi dei file.


5
2018-06-11 05:40



Per tcsh (che non ha funzioni), puoi usare:

gi foo `find -name "*bar*"`

Per bash / ksh / sh, puoi creare una funzione nella shell.

   function foobar 
   {
      gi $1 `find . -type f -name "*"$2"*"`
   }

   foobar foo bar

Ricorda che l'uso di backquote nella shell è più vantaggioso dell'uso di xargs da più punti di vista. Inserisci la funzione nel tuo .bashrc.


0
2018-06-11 07:20



Usando Bash puoi anche specificare il numero di argomenti passati al tuo alias (o funzione) in questo modo:

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

(dovrebbe funzionare per tcsh in un modo simile)

# alias definition in ~/.tcshrc
echo arg1 arg2 | xargs -n 1 tcsh -cim 'myFuncOrAlias "$1"' arg0  # untested

0
2017-07-19 10:20



Questo è un personaggio speciale sicuro:

find . -print0 | xargs -0 bash -ic 'echo gi foo "$@"' --

Il -print0 e -0 uso \0 o NUL-stringa terminata in modo da non far accadere cose strane quando i nomi dei file contengono degli spazi.

bash imposta il primo argomento dopo la stringa di comando come $0, quindi passiamo a un argomento fittizio (--) in modo che il primo file elencato da find non viene consumato da $0.


0
2017-12-01 13:43