here-doc를 사용하지 않고 파일 설명자에 여러 줄을 쓰고 차단하지 않고 <&{fd}를 읽은 후 삭제하세요.

here-doc를 사용하지 않고 파일 설명자에 여러 줄을 쓰고 차단하지 않고 <&{fd}를 읽은 후 삭제하세요.
#!/usr/bin/env bash

auth() { 
    exec 3<<AUTH
$1
$2
AUTH
}

auth test pwd
sh -c 'cat <&3'

인증 파일/메모리에 자격 증명을 형식으로 임시 저장하고 싶습니다 user/npass. 이 형식은 읽은 후에 삭제해야 합니다 <&3. 그것을 읽는 바이너리는 bash5+가 있는 docker alpine 컨테이너에서 무한히 실행되고 환경에서 실행되므로 /bin/sh이와 같은 서브셸은 cat <(echo -e "$1\n$2")작동하지 않으며 명령이 끝난 후 임시 파일을 삭제하는 것은 옵션이 아닙니다.

위의 코드는 작동하지만 들여쓰기가 없는 문서의 모양이 마음에 들지 않습니다. 실제 탭을 사용할 수 있다는 것을 알고 있지만 <<-EOF이는 결국 공개 저장소에 남게 되고 일부 편집자는 탭을 4개의 공백으로 대체하더라도 작업을 해야 하므로 이에 의존할 수 없습니다.

echo $user>$3출력을 (echo -e "$1\n$2")fd에 넣는 다른 방법이 있습니까 ?

<&3내가 무엇을 시도하든 결국 입력이 차단되고 EOF가 끝나기를 기다리거나 fd 내용이 삭제되지 않습니다.

미리 감사드립니다!

답변1

이것이 좋은 습관인지, 무엇을 하고 싶은지 추상화하면 다음과 같습니다.

#!/usr/bin/env bash

auth() { 
    exec 3< <(printf "%s\n%s\n" "$1" "$2")
}

auth test pwd
sh -c 'cat <&3'

예상대로 결과는 다음과 같습니다.

$ ./auth.bash 
test
pwd

답변2

FWIW, 언제든지 다음을 수행할 수 있습니다.

auth() {
  exec 3<<< "$1"$'\n'"$2"
}

또는:

auth() {
  eval $'exec 3<< EOF\n$1\n$2\nEOF'
}

이것이 가독성에 얼마나 도움이 되는지 잘 모르겠습니다.

5.1 이전의 Bash 버전은 여기서는 문서에 삭제된 임시 파일을, 여기에서는 문자열에 대해 삭제된 임시 파일을 사용했고, 5.1부터는 짧은 콘텐츠에 파이프를 사용하고 파이프에 맞지 않는 콘텐츠에 대해 삭제된 임시 파일을 사용했습니다.

이는 최신 버전에서는 데이터를 fd 3에서 한 번만 읽을 수 있음을 의미합니다(되감기( lseek())할 수 없으며 를 열어 처음부터 다시 읽을 수 없음 /proc/self/fd/3).

관련 정보