Bash는 현재 셸의 하위 셸에서 반환된 인수를 사용합니다.

Bash는 현재 셸의 하위 셸에서 반환된 인수를 사용합니다.

제목이 나쁘다면 죄송합니다(이미 제가 생각해 낼 수 있는 최고의 제목입니다).

어쨌든 코드 줄은 다음과 같습니다.

printf "%s\n" "$(echo a b "c d")

간단한 코드. 물론 나중에 내 코드로 대체하겠습니다. 이 예는 설명하기에 충분합니다.

위의 코드는 다음을 출력합니다:

a b c d

내가 원하는 출력은 다음과 같습니다.

a
b
c d

서브쉘을 사용하여.

전체적으로 답변에 있는 코드의 "구조"는 질문의 첫 번째 코드 조각과 대략 유사해야 합니다.

가능합니까? 어떤 도움이라도 좋을 것입니다.

추신 : 의견이 요청되면 개선하기 위해 질문을 편집하겠습니다.

답변1

readarray -td ''bash에서 배열로 가져올 수 있는 임의의 문자열 목록을 인쇄하려면 (bash-4.4+ 가정) 다음을 사용하여 가져올 수 있는 NUL 구분 목록(bash 변수는 NUL 문자를 포함할 수 없으므로)을 사용할 수 있습니다 .

print0() { [ "$#" -eq 0 ] || printf '%s\0' "$@"; }

readarray -td '' list <(print0 a b "c d" $'e\nf')

또는 배열 정의를 인쇄 typeset -p하고 imports 를 사용하게 하면 eval희소 배열이나 여러 배열을 전달할 수도 있습니다.

eval "$( list=(a b "c d" $'e\nf'); typeset -p list)"

이에 대한 도우미를 정의할 수 있습니다.

print_array() {
  eval "local $1"='( "${@:2}" )'
  typeset -p "$1"
}
bash-5.0$ eval "$(print_array list a b 'b c' $'e\nf')"
bash-5.0$ printf ' - <%s>\n' "${list[@]}"
 - <a>
 - <b>
 - <b c>
 - <e
f>

함수 내에서 호출되는 경우 배열은 배열 정의 typeset앞에 추가 되므로 함수에 대해 로컬이 됩니다.declare -a

인쇄하여 set -- a b 'c d'...위치 매개변수로 가져올 수도 있습니다.

set_argv() { printf 'set --'; [ "$#" -eq 0 ] || printf ' %q' "$@"; }
bash-5.0$ eval "$(set_argv a b 'b c' $'e\nf')"
bash-5.0$ printf ' - <%s>\n' "$@"
 - <a>
 - <b>
 - <b c>
 - <e
f>

bash의 typesetor 는 printf %q항상 가장 안전한 인용 방법을 사용하지 않으므로 주의하세요.이 결과 평가와 관련된 잠재적 위험.

답변2

주어진 예에서는 배열을 사용해야 합니다. 바라보다정렬그리고매개변수 확장~에서배쉬 매뉴얼 페이지배열에 대한 추가 정보.

args=(a b "c d")
printf '%s\n' "${args[@]}"

명령 출력을 매개변수로 사용해야 하는 경우 IFS매개변수를 매개변수 구분 기호 및 명령 대체 요소로 사용할 수 있습니다. 토큰화 후에 와일드카드가 수행되므로 와일드카드를 일시적으로 비활성화할 수 있으며 빈 항목은 토큰화 중에 삭제된다는 점에 유의하는 것이 중요합니다(감사합니다.스티븐 차제라스알림용).

# save previous IFS value and change it to line feed
OLDIFS=$IFS IFS=$'\n'

# temporarily disable globbing if needed
#set -o noglob

# save command output to array, words are separated by IFS
args=($(printf 'arg 1\narg 2\narg 3\n'))

# reenable globbing if needed
#set +o noglob

# restore IFS
IFS=$OLDIFS

# expand array as command arguments
printf '%s\n' "${args[@]}"

사용xargs더 쉬운 옵션일 수도 있지만 쉘 내장 기능이 아니며 쉘 내장 기능을 직접 호출할 수 없다는 점을 잊지 마십시오. 따라서 아래 예에서는 printfBash 내장 기능을 호출하지 않고 printf바이너리(보통 다음 위치에 있음)를 호출합니다. /bin/printf또는 /usr/bin/printf).

# POSIX xargs requires quoting
printf '"arg 1" "arg 2" "arg 3"' | xargs printf '<arg>%s</arg>\n'

# other xargs (like GNU) versions have a `-d` delimiter option
printf 'arg 1\narg 2\narg 3' | xargs -d'\n' printf '<arg>%s</arg>\n'

GNU 및 기타 언어에는 인수를 널 문자(보통 로 표시)로 구분할 수 있는 xargs(비표준) 옵션도 있는데 , 이는 인수가 널 바이트를 포함할 수 없기 때문에 매우 편리합니다. 다른 명령은 이를 고려하여 표준 옵션은 아니지만 구분된 파일을 사용하는 옵션을 포함하여 많은 버전에서처럼 null 바이트를 사용하여 항목을 구분할 수 있습니다.-0'\0'find-print0'\0'

# find files under /bin and calculate their sha256 digests
find /bin/ -type f -print0 | xargs -0 sha256sum

관련 정보