Pasar file de input a través de la tubería como argumento?

Tengo dos problemas Estoy tratando de pasar files a través de una tubería como argumento, y estoy tratando de usar ese file como una variable dentro de la function sh .

Aquí está mi command:

 find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh 

Aquí, mi línea es encontrar todos los files que se parecen a " segment.something " y pasarlo al lado derecho de la tubería. En someFunction.sh , necesito el nombre del file como argumento. Digamos que el file se segment1 en segment1 .

El someFunction.sh imprimirá cada línea del segment1 (por ejemplo).

¿Cómo paso la salida desde el lado izquierdo de la tubería hacia el lado derecho, y luego cómo lo llamo dentro de someFunction.sh ?

Tu command

 $ find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh 

tiene el efecto de que se someFunction.sh al less cuatro copys del someFunction.sh shell someFunction.sh ( -P 4 ) en paralelo (se generarán nuevas tan pronto como se realicen las anteriores), cada una de las cuales obtendrá un nombre de file como argumento ( -n 1 ).

Esto significa que cada invocación de tu script se verá como

 sh someFunction.sh segmentsomething 

Dentro de la secuencia de commands, el shell colocará los valores de los parameters posicionales (los arguments en la command-line) en $1 , $2 etc. ( $0 generalmente contiene el nombre del script en sí). En su caso, $1 contendrá el nombre del file y los demás estarán vacíos.

Entonces, en el guion:

 filename="$1" echo "$filename" cat "$filename" 

Eso es eso. Ahora, generalmente cuando uno utiliza find para search files y pasar sus nombres de file a xargs existe el problema con los nombres de file wonky que las personas tienden a recordarse mutuamente, y lo haré aquí también.

La utilidad de find pasa nombres de file separados por espacios en blanco. Eso no es bueno si tiene nombres de files con espacios en ellos, ya que eso causaría problemas para que xargs invoque su script con nombres propios.

Por lo tanto, es una buena práctica usar siempre -print0 con find y -0 con xargs , lo que significa que los nombres de file, en lugar de estar separados por espacios, están separados por nul caracteres ( \0 ). Esto lo hace mucho más seguro.

Así:

 $ find . -name 'segment*' -print0 | xargs -0 -n1 -P4 sh someFunction.sh 

Podrías usar algo como esto asumiendo que someFunction.sh está en tu directory de trabajo.

 find . -name 'segment*' -print0| xargs -0 -n1 -P4 ./someFunction.sh 

El -print0 y -0 permiten files con espacios en el nombre (Un problema común). En mi someFunction.sh tengo

 #!/bin/bash echo "Arg: " $1 cat $1 

Lo cual simplemente repite el nombre del file y luego escribe el contenido del file pasado a someFunction.sh