File di piping su un command che non implementa le condutture

$ cat foo foo bar 

Ora, se faccio:

 $ some_program foo 

Sta funzionando.

Ma se provo:

 $ cat foo | some_program 

La sua non funziona.

Sto cercando un modo pulito per l'input di pipe a some_program senza wherer utilizzare file temporanei disordinati.

La piping metterà lo stdout del some_program in some_program stdin di some_program . In questo caso some_program si aspetta un argomento, non stdin, quindi vuoi memorizzare il risultato di un cat foo in una variabile e quindi call una variabile some_program $variable .

Non sono troppo sicuro di script di bash, ma provare questo?

 bar=`cat foo` some_program $bar 

In realtà, forse questo functionrà …

 some_program `cat foo` 

In bash puoi utilizzare la sostituzione del process

 $ some_program <(cat foo) 

È ansible aggiungere il maggior numero di parametri che ti piace in questo modo, a patto che sappiate che questi parametri saranno nomi di file che verranno solo letti. Non è ansible leggere e scrivere contemporaneamente.

Oltre al modo @Bob proposto, c'è un altro metodo più flessibile: xargs :

Potresti usare

 cat foo | xargs some_program 

che è fondamentalmente equivalente di

 some_program `cat foo` 

Se il programma prevede solo un argomento alla volta, puoi farlo

 cat foo | xargs -n 1 some_program 

E some_program saranno chiamati una volta per each linea di input.

Ci sono molte altre opzioni per xargs , come una gestione attenta dei nomi di file "cattivi" (con spazi e altri caratteri speciali), limitando il numero di processi in esecuzione contemporanea, ecc., Che potrebbero essere trovati in man-page.