2012-06-12 2 views
3

은 내가 이런 식으로 호출이 파이프에서 오는printf, 초과 인수를 무시 하시겠습니까?

$ printf -v var "Hello world" 

$ printf "$var" 
Hello world 

작동이

$ grep "Hello world" test.txt | xargs printf -v var 
-vprintf: warning: ignoring excess arguments, starting with `var' 

$ grep "Hello world" test.txt | xargs printf -v var "%s" 
-vprintf: warning: ignoring excess arguments, starting with `var' 

답변

8

xargs가 호출합니다 작동하지 않으면 배쉬 printf-v 옵션

-v var assign the output to shell variable VAR rather than 
      display it on the standard output 

을 가지고 오늘 발견 /usr/bin/printf (또는 해당 바이너리가 시스템에 설치된 곳이면 어디에서나). bash의 내장 기능을 호출하지 않습니다. 그리고 내장 된 (또는 스크립트 또는 유사한 것을 소싱하는 것만) 쉘의 환경을 수정할 수 있습니다.

bash의 내장 함수를 호출 할 수있는 경우에도 예제의 xargs은 하위 셀에서 실행됩니다. 서브 쉘은 어쨌든 부모의 환경을 수정할 수 없습니다. 그래서 당신이하려는 것은 효과가 없습니다.

샘플을 올바르게 이해하면 몇 가지 옵션이 표시됩니다. 샘플 데이터 :

$ cat input 
abc other stuff 
def ignored 
cba more stuff 

간단한 변수 (약간 까다로운 당신이 원하는 정확히 무엇에 따라) :

$ var=($(grep a input)) 
$ echo "${var[0]}"-"${var[1]}" 
abc-other 

: 당신이 배열에서 개별 단어를 원하는 경우 배열로

$ var=$(grep a input) 
$ echo $var 
abc other stuff cba more stuff 
$ echo "$var" 
abc other stuff 
cba more stuff 

또는 각 배열 요소의 전체 줄을 원하는 경우 :

$ IFS=$'\n' var=($(grep a input)) ; unset IFS 
$ echo "${var[0]}"-"${var[1]}" 
abc other stuff-cba more stuff 
1

두 개의 printf가 있습니다. 하나는 쉘 bultin이며, 이것은 printf를 실행하고 다른 하나는 보통/usr/bin/printf 인 일반 바이너리 인 경우 호출됩니다. 후자는 -v 인수를 취하지 않으므로 오류 메시지가 표시됩니다. printfxargs의 인수이므로 이진 파일은 셸 bulitin이 아니라 실행됩니다. 또한 파이프 라인의 수신단에 있기 때문에 하위 프로세스로 실행됩니다. 변수는 부모 프로세스에서 자식 프로세스로만 상속 될 수 있지만 다른 방법으로 상속 될 수는 없으므로 printf 바이너리가 환경을 수정할 수 있다고하더라도 변경 사항은 부모 프로세스에 표시되지 않습니다. 따라서 명령이 작동하지 않는 데에는 두 가지 이유가 있습니다. 하지만 언제든지 var=$(something | bash -c 'some operation using builtin printf') 할 수 있습니다.

+0

그렇지가 있다는입니다 파이프 라인이 끝날 때 외부 실행 파일 ('/ usr/bin/printf') 만 허용하는 것이 xargs의 주장입니다. 또한 예제는'-v'를 제거하지 않으면 결과가 없습니다. –

+0

@DennisWilliamson 네 말이 맞아. 고마워. 고정. –

0

매트는 무슨 일이 벌어지고 있고 왜 일어나는지에 대한 훌륭한 설명을 제공합니다. 당신이 명령의 출력을 반복하고 배쉬의 sprintf 스타일 printf 기능 (-v)를 사용하여 연속적인 값으로 변수를 설정하려면

, 당신은 이런 식으로 작업을 수행 할 수 있습니다

grep "Hello world" test.txt | xargs bash -c 'printf -v var "%-25s" "[email protected]"; do_something_with_formatted "$var"' _ {} \; 
관련 문제