私が何をしているのか
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
$mylogs
stdout
ただし、ユーザー入力を傍受し、ただで代わりに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