이 맥락에서 Paste -d@는 무엇을 의미합니까? IFS=@와도 혼동됨

이 맥락에서 Paste -d@는 무엇을 의미합니까? IFS=@와도 혼동됨

문맥:https://stackoverflow.com/questions/52299524/duplicate-output-looping-through-multiple-values-in-while-loop-bash/52301168#52301168

참고: 각 파일에 한 줄씩 1개의 단어가 포함되어 있으면 이는 간단합니다.

소스 파일에서 공백을 사용하려는 경우 다른 구분 기호를 사용할 수 있습니다.

while IFS=@ read -r aws_user_name aws_key aws_account_num ;do
    printf "User: %-16s Key: %-22s AccNum: %s\n" \
        "$aws_user_name" "$aws_key" "$aws_account_num"
    # ....
done < <(
    paste -d@ "$aws_users_all" "$aws_env_list" "$aws_account_numbers"
)

IFS=@ paste -d@그게 무슨 뜻인지 잘 모르겠어요 ? 나는 그것을 이해 paste -d "|,"하고 IFS=";"가 무엇을 의미하는지 알아낼 수도 있습니다. 나도 팔로우한다https://stackoverflow.com/questions/7427262/how-to-read-a-file-into-a-variable-in-shell https://man7.org/linux/man-pages/man1/bash.1.html

답변1

FWIW, 답변보다 의견에 더 가깝습니다.@roaima 제공), 다음과 같이 작성하는 것이 더 합리적입니다.

while
  IFS= read -r aws_user_name <&3 &&
    IFS= read -r aws_key <&4 &&
    IFS= read -r aws_account_num <&5
do
  printf "User: %-16s Key: %-22s AccNum: %s\n" \
    "$aws_user_name" "$aws_key" "$aws_account_num"
    # ....
done 3< "$aws_users_all" 4< "$aws_env_list" 5< "$aws_account_numbers"

@나중에 가입하고 분할하는 대신 @.

이 방법으로 @in 값을 갖는 것은 문제를 일으키지 않으며 3개 목록의 누락된 요소가 올바르게 감지됩니다. 또한 <(...)kshism을 방지하여 표준 코드로 만듭니다 sh.

awk루프가 수행하는 작업이 전부 인쇄라면, perl이와 같은 루프에서 일부 투박한 도구를 여러 번 호출하는 것보다 적절한 텍스트 처리 유틸리티를 사용하는 것이 더 합리적일 수 있습니다. 자세한 내용은 다음을 방문하세요.쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?

답변2

이제 이해했으므로 필드를 구분하는 대신 paste -d "|,"의미를 추론할 수도 있습니다 . paste -d@이는 동일한 프로세스입니다 . (많은 UNIX/Linux 도구와 마찬가지로 플래그와 해당 인수는 공백으로 연결되거나 구분될 수 있습니다. 표준 구문 분석 라이브러리는 상관하지 않습니다.|,@POSIX 유틸리티 인수 구문, 포인트 2a. )

이 경우 IFS변수는 동사가 입력을 구문 분석하는 방법을 결정합니다 read. 변수 aws_user_name, aws_key및 는 aws_account_num출력에서 ​​읽혀지고 paste -d@방금 추가된 기호에서 분할됩니다.@paste

명령을 부분적으로 분석하여 무슨 일이 일어나고 있는지 확인할 수 있습니다. paste명령을 실행하면(세 변수에 대한 적절한 파일 이름 사용) while read …루프가 처리할 내용이 표시됩니다.

paste -d@ "$aws_users_all" "$aws_env_list" "$aws_account_numbers"

@소스 값에 구분 기호( )가 포함되어 있으면 이 처리가 중단됩니다 .

관련 정보