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)。

関連情報