Come ripetere le variabili due volte in xargs


21

Come posso fare il secondo eco per eseguire l'eco test anche in questo esempio:

 echo test  | xargs -I {} echo {} && echo {}
xargs 

var=test & echo $var ...
alexus

xargs -I {} var = {} echo $ var && echo $ var Questo ti darebbe: nessun file o directory.

Risposte:


27

Scrivi {}due volte al tuo comando. Quanto segue funzionerebbe:

$ echo test | xargs -I {} echo {} {}
test test

Il tuo problema è come sono nidificati i comandi . Vediamo questo:

echo test | xargs -I {} echo {} && echo {}

bash verrà eseguito echo test | xargs -I {} echo {}. Se funziona correttamente, echo {}viene eseguito. Per cambiare l'annidamento, potresti fare qualcosa del genere:

echo test | xargs -I {} sh -c "echo {} && echo {}"

Tuttavia, potresti avere problemi perché l'approccio potrebbe essere incline all'iniezione di codice. Quando "test" viene sostituito con il codice shell, viene eseguito. Pertanto, dovresti probabilmente passare l'input alla shell nidificata con argomenti.

echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}

3
Si noti che si ottengono risultati imprevisti nel tuo ultimo codice eventualmente scelto afile callod, letteralmente, $(rm -f *). È meglio farexargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Kusalananda

@Kusalananda, grazie. Ero consapevole del problema, ma in quel momento non riuscivo a pensare a una soluzione semplice. Ho integrato il tuo suggerimento nella risposta.
JojOatXGME

5

Un'altra opzione è usare -iflag, che è lo stesso di -I{}(implica che la sostituzione è data con {}):

$ echo test | xargs -i echo {} {}

1
Nel frattempo: This option is deprecated; use -I instead.è stato aggiunto al manuale man xargs.
Jonathan Komar il

0

Per me funziona solo il minuscolo. Avevo centinaia di immagini in una directory e volevo inserire le loro fonti in un elenco. L' -Iopzione maiuscola i non ha funzionato per me. Solo la minuscola. Probabilmente a causa delle differenze di versione. Tutte queste immagini avevano nomi come Daniel_(somenumber).jpg.

Questa sintassi ha funzionato:

ls -l | tr -s ' ' ':'| cut -d: -f9 | xargs -i echo "img src='"{}"'alt='{}'"

Ritorna:

src='Daniel_248.jpg' alt='Daniel_248.jpg'
...

Linux ver 4.14.96-hw + # 80 SMP x86_64 GNU / Linux


2
Ho aggiunto un po 'di formattazione alla tua risposta per renderla più leggibile. Spero di averlo capito correttamente.
fra-san,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.