빈 배열이 있습니다
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 mapfile
및 bash
매뉴얼 도 참조하십시오 ( readarray
명령과 mapfile
명령은 동일함).
답변2
상위 프로세스(예: Bash)가 하위 프로세스(예: xargs)를 시작하면 하위 프로세스는 환경의 복사본(배열 변수 arr 포함)을 가져오고 프로세스는 해당 환경을 업데이트할 수 있지만 종료되면 환경은 다음과 같습니다. 상위 프로세스로 다시 전달되지 않습니다.
따라서 일반적으로 귀하의 질문에 대한 대답은 '아니오'입니다.
더 중요한 것은 xargs가 환경 변수를 업데이트할 수 없으며 단지 다른 명령을 실행한다는 것입니다.