일련의 숫자를 인쇄한 다음 끝에 뭔가를 추가하는 데 문제가 있습니다.
seq 1 3 | xargs -I {} echo {} 4
밝혀지다
1 4
2 4
3 4
하지만 결과가 나왔으면 좋겠다
1 2 3 4
나는 배우고 있기 때문에 이것을 달성하기 위해 xargs
그것을 사용하고 싶습니다 xargs
.
답변1
command
GNU를 통해 단일 호출 에 특정 수의 라인을 인수로 전달하려면 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
당신이 할 수 있는 일은 sh
ell을 호출하여 실행하는 것 입니다 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
$@
xargs
bang
0
command_name
sh
$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
).