Funciones de tuberías con otros commands en Linux

Me gustaría canalizar una function con commands normales en Linux. Tenga en count que todos estos commands se ponen en una secuencia de commands .sh (utilizo Bash shell). Por ejemplo, tengo un command de la siguiente manera:

git diff --name-only HEAD~1..HEAD -z | xargs -0 dirname | catch_exceptions >> extracted_dir_names

He escrito catch_exceptions como una function sobre este command y contiene 2 declaraciones sed delete. Si canalizo los dos commands sed en la function que funcionan, pero si los pongo uno después del otro no lo hacen. ¿Alguien podría explicar por qué es así y cómo se puede hacer un trabajo en set? Gracias por adelantado.

Esto funciona:

 function catch_exceptions { sed '/^\./d' | sed '\#this/path/alone#d' } pushd /path/to/direc rm -f extracted_directories.txt git diff --name-only HEAD~1..HEAD -z | xargs -0 dirname | remove_duplicates | catch_exceptions >> extracted_directories.txt cat extracted_directories.txt popd } 

Pero cuando reemploop catch_exceptions con:

 function catch_exceptions { sed '/^\./d' sed '\#this/path/alone#d' } 

no funciona

Con la primera function, la salida del primer command sed se alimenta al segundo, de modo que cuando el primero finaliza, el segundo también lo hace.

Con la segunda function, la salida de la primera sed se envía directamente a la salida estándar, y solo cuando termina, comienza la segunda sed . El segundo sed tiene su input estándar todavía conectada a la tubería, pero la primera lee todos los datos, por lo que la segunda sed no recibe nada para procesar.

Si desea que ambos commands sed lean desde la misma tubería, repase Dos niños leyendo de una tubería y considere usar tee con la sustitución del process . Revise también Redirect stdout de un process a dos processs .

Si desea dirigir la salida a más sed en la function, puede usar temporalmente files.

 sed '/^\./d' input.txt > tmp.txt sed '\#this/path/alone#d' tmp.txt > output.txt rm tmp.txt