xargs는 여러 줄을 단일 명령 호출에 대한 인수로 처리합니다.

xargs는 여러 줄을 단일 명령 호출에 대한 인수로 처리합니다.

일련의 숫자를 인쇄한 다음 끝에 뭔가를 추가하는 데 문제가 있습니다.

seq 1 3 | xargs -I {} echo {} 4

밝혀지다

1 4
2 4
3 4

하지만 결과가 나왔으면 좋겠다

1 2 3 4

나는 배우고 있기 때문에 이것을 달성하기 위해 xargs그것을 사용하고 싶습니다 xargs.

답변1

commandGNU를 통해 단일 호출 에 특정 수의 라인을 인수로 전달하려면 xargs다음과 같은 명령을 실행할 수 있습니다.

multi-line cmd | xargs -d '\n' -n N command

\n즉, 구분 기호 로 사용되며 한 번에 1N 행을 전달하는 것은 실행하는 것과 같습니다.command

command line1 line2 ... lineN  

이제 xargs다음을 수행하십시오.

input | xargs [options] [command [initial-arguments]]

즉, 빌드할 때 명령줄에 추가된 모든 매개변수는 xargs초기 매개변수 뒤에 표시됩니다.command

multi-line cmd | xargs -d '\n' -n N command initial-args

실행됩니다

command initial-args line1 line2 ... lineN  

그렇기 때문에 당신은 뛰지 못한다.

seq 1 3 | xargs -d '\n' -n 3 echo 4

4초기 매개변수로 처리되고 최종 결과는 다음과 같으 므로 예상되는 출력을 얻습니다.

4 1 2 3

당신이 할 수 있는 일은 shell을 호출하여 실행하는 것 입니다 command. 이렇게 하면 끝에 추가 매개변수를 넣을 수 있습니다:

seq 1 3 | xargs -d '\n' -n 3 sh -c 'echo "$@" 4' bang
1 2 3 4

bang위 줄에 뭐라고 쓰여 있나요?sh -c 통사론

sh -c command_string [command_name [argument...]]

따라서 (위치 매개변수로 확장됩니다. 이 경우 에 의해 추가된 매개변수) 'echo "$@" 4'특수 매개변수입니다(예를 들어 임의의 이름을 사용할 수 있음). 읽어볼 가치가 있습니다.command_string$@xargsbang0command_namesh$0이 위치 매개변수가 아닌 이유는 무엇입니까?


xargs내 게시물은 GNU 및 해당 독점 스위치를 언급한다는 점에 유의하십시오 -d. 또는 셸에서 이 작업을 수행하여 출력 줄을 배열에 저장하고 해당 요소를 command다른 인수 앞에 인수로 전달할 수 있습니다
.bash

readarray -t args < <(multi-line cmd)
command "${args[@]}" additional-arg(s)

또는zsh

args=("${(@f)$(multi-line cmd)}")
command "${args[@]}" additional-arg(s)

1: 이 선이 한계 내에 N있다고 가정합니다.ARG_MAX

답변2

일부 줄을 단일 줄로 변경하는 것은 에 의해 수행됩니다 paste -s.

이 예에서는 4개의 행을 1개의 행으로 변경하려고 합니다. 이 네 줄은 다음 명령으로 생성되었습니다 seq 1 3; echo 4.

$ seq 1 3; echo 4
1
2
3
4

이를 전달 paste -d ' ' -s -하여 줄로 변환하고 각 원래 줄을 공백 문자로 구분합니다.

$ { seq 1 3; echo 4; } | paste -d ' ' -s -
1 2 3 4

tr '\n' ' 'by 대신에 by 줄을 전달할 수도 있지만 paste -s그렇게 하면 마지막 개행 문자(그 뒤의 문자 4)가 공백으로 바뀌게 되는데, 이는 아마도 여러분이 원하는 것이 아닐 것입니다.

답변3

xargs 부분이 좋습니다. seq는 다음과 같은 구분 기호를 사용할 수 있습니다.

seq -s ' ' 1 3 | xargs -I {} echo {} 4

답변4

BSD에서는 이 옵션이 다음과 같이 사용됩니다 -J:

$ seq 3 | xargs -J {} echo {} 4
1 2 3 4

그럼에도 불구하고, xargs매개변수 목록이 너무 커서 제한을 초과하는 경우에도 명령은 여러 번 호출됩니다 execve().

다른 xargs구현의 경우 이미 말했듯이 sh매개변수 순서를 변경할 수 있습니다.

$ seq 3 | xargs sh -c 'echo "$@" 4' sh
1 2 3 4

xargs이 옵션을 지원하지 않는 구현 의 경우 하나 이상의 인수가 전달되었는지 확인할 -r수도 있습니다 .sh

cmd1 | xargs sh -c '[ "$#" -eq 0 ] || exec cmd2 "$@" additional args' sh

이렇게 하면 exec셸 구현에서 포크가 절약되지만 최적화가 자동으로 수행되지는 않습니다. 와 같은 내장 명령의 경우 echo일부 sh구현(예: bash) 에서는 다음 exec을 사용합니다.외부내장된 명령 대신 사용 가능한 경우 호출되는 명령으로, sh사용하지 않을 때와 비슷하게 동작합니다( xargs cmd2).

관련 정보