Reindirizzamento a stdin anziché argomento quando si utilizza xargs [chiuso]


12

per exmaple, usando il comando

cat foo.txt | xargs -I{} -n 1 -P 1 sh -c "echo {} | echo"

Il foo.txtcontiene due righe

foo
bar

Il comando sopra non stampa nulla.

Risposte:


6
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh" 

La parte complicata è che xargs esegue una chiamata implicita alla subshell. Qui viene invocato esplicitamente e pipe non diventa la parte del trasportatore padre


1
Grazie, ho aggiornato la mia domanda per fornire un esempio più concreto. ma non funziona come hai suggerito ..
Ryan

1
l'eco non può essere letta da Stdin, quindi non è necessario eseguire il piping su di essa. confronta questo: cat foo.bar | wc -lecat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
Kondybas il

1
Penso che intendi -Iinvece di -J; non c'è alcuna -Jopzione per xargs
Hitechcomputergeek

La versione di @Hitechcomputergeek di FreeBSD xargsha -Jun'opzione equivalente a quella -idi Linuxxargs
Kondybas,

@Kondybas Grazie per avermelo detto; Non sapevo che ci fosse una differenza tra i due. Puoi fidarti di GNU per non seguire POSIX lol. ( -Jnon è definito in POSIX ma lo -Iè e ha un uso diverso da quello di GNU.)
Hitechcomputergeek

2

Se vuoi elaborare tutte le righe di foo.txt dovrai usare un loop. Utilizzare &per mettere il processo in background

while read line; do
   echo $line | bar.sh &
done < foo.txt

Se l'input contiene spazi, imposta temporaneamente il separatore di campo interno sulla nuova riga

# save the field separator
OLD_IFS=$IFS

# new field separator, the end of line 
IFS=$'\n'

for line in $(cat foo.txt) ; do
   echo $line | bar.sh &
done

# restore default field separator  
IFS=$OLD_IFS     

No-no, anche io sono bloccato. TS vuole dividere il file in righe separate e inserirle nello script in modo indipendente
Kondybas

1
Devo usare xargs per mettere in parallelo il processo.
Ryan,

OK :-) Ho appena cercato le opzioni xargsdell'OP utilizzato.
Matteo,
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.