xargs를 사용할 때 인수 대신 stdin으로 리디렉션


12

예를 들어, 명령을 사용하여

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

foo.txt두 줄 이 들어 있습니다

foo
bar

위의 명령은 아무것도 인쇄하지 않습니다.

답변:


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

까다로운 부분은 xargs가 암시 적 서브 쉘 호출을 수행한다는 것입니다. 여기에서 명시 적으로 호출되었고 파이프는 상위 컨베이어의 일부가되지 않습니다.


1
감사합니다.보다 구체적인 예를 제공하기 위해 질문을 업데이트했습니다. 하지만 제안한대로 작동하지 않습니다.
Ryan Ryan

1
반향은 stdin에서 읽을 수 없으므로 배관에 의미가 없습니다. 이 비교 : cat foo.bar | wc -lcat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
Kondybas

1
나는 당신이 -I대신 의미 를 생각 -J; -Jxargs에 대한 옵션 이 없습니다
Hitechcomputergeek

의 @Hitechcomputergeek FreeBSD의 버전 xargs-J에 해당 옵션을 -i리눅스의xargs
Kondybas

@Kondybas 말해줘서 고마워; 나는 둘 사이에 차이가 있다는 것을 몰랐다. POSIX lol을 따르지 않도록 GNU를 신뢰할 수 있습니다. ( -JPOSIX에는 정의되어 있지 않지만 -IGNU와 다른 용도로 사용됩니다.)
Hitechcomputergeek

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     

아니, 나도 붙어있어. TS는 파일을 별도의 줄로 나누고 독립적으로 스크립트에
넣기를 원합니다.

1
프로세스를 병렬화하기 위해 xargs를 사용해야합니다.
Ryan

OK :-) 방금 xargs사용한 OP 옵션을 찾았습니다 .
Matteo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.