Перенаправление на stdin вместо аргумента при использовании xargs

Перенаправление на stdin вместо аргумента при использовании xargs

например, используя команду

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

Содержит foo.txtдве строки

foo
bar

Приведенная выше команда ничего не выводит.

решение1

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

Хитрость в том, что xargs выполняет неявный вызов подоболочки. Здесь sh вызывается явно, а pipe не становится частью родительского конвейера

решение2

Если вы хотите обработать все строки foo.txt, вам придется использовать цикл. Используйте &для перевода процесса в фоновый режим

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

Если входные данные содержат пробелы, временно установите внутренний разделитель полей на новую строку.

# 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     

Связанный контент