"xargs"를 사용하여 배열에 요소를 추가할 수 있습니까?

"xargs"를 사용하여 배열에 요소를 추가할 수 있습니까?

빈 배열이 있습니다

arr=()

xargs이 배열에 요소를 추가하는 데 사용할 수 있는 것이 있나요?

이와 같이:

echo "test" | xargs arr+=()

답변1

아니요, 그건 불가능합니다. 이 xargs도구는 얻은 입력량에 따라 외부 유틸리티를 한 번 이상 실행합니다. 배열 할당은 외부 유틸리티의 이름이 아닐 가능성이 높으므로 실행되지 않습니다. 또한 xargs도구 자체는 외부 유틸리티이므로 현재 셸 환경에서는 아무 것도 변경할 수 없습니다.

이렇게 하면 더 쉬울 텐데

arr+=( test )

또는 명령에서 배열을 읽으려는 경우(명령 출력의 한 줄에 하나의 요소):

readarray -t -O "${#arr[@]}" arr < <( some_command )

그러면 배열 끝에 새 요소가 추가되기 시작 arr하고 출력의 각 행을 some_command새 배열 요소로 읽습니다. 이 -O옵션은 데이터가 삽입될 배열의 오프셋을 결정하고 "${#arr[@]}"배열 길이만큼 확장됩니다 arr. 따라서 배열의 현재 끝 부분부터 데이터 삽입을 시작합니다 arr. 효과는 배열에 요소를 추가하는 것입니다.

이전 명령을 테스트합니다.

$ arr=( 1 2 3 )
$ readarray -t -O "${#arr[@]}" arr < <( printf 'a\nb\nc\n' )
$ printf '%s\n' "${arr[@]}"
1
2
3
a
b
c

1이 예에서는 요소가 추가되는 것을 보여주기 위해 2및 세 개의 요소가 있는 배열로 시작합니다 . 3배열은 처음에는 비어 있을 수도 있습니다.

배열이 다음과 같은 경우모두 다 아는비어 있거나 원하는 경우 바꾸다요소를 배열에 추가한 다음 옵션 없이 명령을 사용하십시오 -O.

readarray -t arr < <( some_command )

위의 명령은바꾸다arr명령의 출력 행에서 요소를 가져온 배열의 모든 요소입니다 some_command.

help mapfilebash매뉴얼 도 참조하십시오 ( readarray명령과 mapfile명령은 동일함).

답변2

상위 프로세스(예: Bash)가 하위 프로세스(예: xargs)를 시작하면 하위 프로세스는 환경의 복사본(배열 변수 arr 포함)을 가져오고 프로세스는 해당 환경을 업데이트할 수 있지만 종료되면 환경은 다음과 같습니다. 상위 프로세스로 다시 전달되지 않습니다.
따라서 일반적으로 귀하의 질문에 대한 대답은 '아니오'입니다.

더 중요한 것은 xargs가 환경 변수를 업데이트할 수 없으며 단지 다른 명령을 실행한다는 것입니다.

관련 정보