"read -p"の出力をstdoutや他のファイルに印刷する方法

"read -p"の出力をstdoutや他のファイルに印刷する方法

私が何をしているのか

echo -n "  - This directory is not empty, purge? (Y/N):   " | tee -a $mylogs
read choice
echo "$choice" | tee -a $mylogs

しかし、次のように圧縮してみたいです。

read -p "  - This directory is not empty, purge? (Y/N): " choice | tee -a $mylogs

これはstdoutとして印刷されますが$mylogs$choiceなぜこれが起こるのか説明がありますか? 1行または2行の代替

  • 印刷のヒント
  • ユーザー入力印刷
  • 入力内容を次の場所に保存してください。$choice

スクリプトのこの部分を記録して再利用できるようにしたいです。$choice

答え1

ちょっとした情報を読んだ後に知りました。これ@lesmana提供、役に立つ

スクリプトを実行してください

script -q -a -f logfile -c 'sh ./yourscriptname'

「ユーザー」からこのロギングを非表示にするには、このスクリプト行をターゲットスクリプトの周りのラッパーに入れてから、ラッパー内でターゲットスクリプトを呼び出すだけです。

答え2

編集する:何もパイプなしでtee生のコンテンツからコンテンツを読むことができることに気づいたので、stdin後でこの問題を偶然発見する人に役立つ場合に備えて、別のソリューションを追加すると思いました。

read -p印刷がstderr機能しないことを指摘してくれた@steeldriverに感謝しますstdout。私が得た最も近いものは次のとおりです。

read -p "  - This directory is not empty, purge? (Y/N): " choice 2> >(tee -a $mylogs)
echo $choice >> $mylogs

何が起こっているのかについてのソースと説明を見つけることができます。ここ。この特定の例では、最初の行をリダイレクトしてプロンプトを印刷stderrできます。tee$mylogsstdout

ただし、ユーザー入力を傍受し、ただで代わりにread送信することを不可能にする措置が取られているようです。$mylogs$choice

もう1つの解決策はよりシンプルで短いですが、ユーザーフレンドリーで読みやすくはありません(多くの人がこれが単に入力を読むだけのreadコマンドではないことを知らない限り)。

echo -n "  - This directory is not empty, purge? (Y/N): " | tee -a $mylogs
choice=$(tee -a $mylogs)

したがって、2行目はteeユーザー入力を提供する方法を提供します。両方 $mylogs そして $choiceとは異なりますが、read明らかにそうではありません。早くオプション( -p)。だからまだ2行です。

また、送信するにはEnter+を押す必要があります。これは私のY / Nの状況ではうまくいかないかもしれませんが、+ Stopを押す前に数回押すことができるので、複数行の答えには良いかもしれません。CtrlDEnterCtrlD

関連情報