GNU/Linux >> Linux の 問題 >  >> Linux

コマンドがユーザー入力を要求するときに、コマンドの出力をファイルにリダイレクトする方法は?

デフォルトでは、STDOUT のみ リダイレクトおよび/またはパイプされます。あなたが望むのは STDOUT を離れることです STDIN 経由で渡されたものは何でも持っています リダイレクトされました。

the_command を編集する場合 はオプションです。質問が STDERR に出力されるようにすることができます 代わりに(リダイレクトに関係なく画面にダンプする必要があります)、ユーザーが入力したものを STDOUT 経由で画面に表示します .


コマンドが機能し、出力をファイル abc.txt に適切にリダイレクトします .
問題は、スクリプトが入力データをどのように要求しているかです スクリプトをどのように実行していますか?
2 つの例で見てみましょう:

# Script_1.sh                                     # 1
echo Please, enter your firstname and lastname    # 2
read FN LN                                        # 3
echo "Hi! $LN, $FN !"                             # 4

そして

# Script_2.sh                                     # 5
read -p "Enter a comment " CM                     # 6
echo  "You said $CM"                              # 7

/bin/bash Script1.sh > abc.txt を実行した場合 tty に「Please enter...」という質問は表示されません。キーボードから期待される入力を与える場合、abc.txt の 2 行目と 4 行目の出力が見つかります。 ファイル。

/bin/bash Script2.sh > abc.txt を実行した場合 「コメントを入力してください」という質問が表示されますが、abc.txt で見つかります。 7 行目の出力のみをファイルします。

注:サブシェルで Script2,sh を実行する場合

(bash Script2.sh 2>&1)> abc.txt

tty には何も出力されず、abc.txt にすべてが表示されます。 ファイル。
で実行すると

bash Script2.sh 2>ccc.txt 1>ddd.txt`

ddd.txt に標準出力 (7 行目) があります。 ccc.txt の標準エラー (6 行目) .

コマンド出力の一部のみをリダイレクトしたい場合 スクリプトを変更する必要があります。
それを行う方法の 1 つは、興味深い出力を生成するスクリプトの一部を移動する関数を作成することです (以下を参照)。次に、主要部分からこの関数を呼び出すことができます スクリプトの (元は関数に移動したコードであった) その出力のみをログ ファイルにリダイレクトします:

 Part_To_Redirect(){
     : # all that you want
 }

 # ... Main part of the script
 # point where it was the part that generates the output
 Part_to_Redirect "[email protected]" > abc.txt   # this to store only that part in the file
 # Part_to_Redirect "[email protected]" >> abc.txt  # this to append that part in the file
 # ...

便利な tee も見つかるはずです それ

<ブロック引用>

出力を複数のファイルにリダイレクトし、標準入力を標準出力にコピーします また、引数として指定されたファイルにも。

 the_command  | tee abc.txt       # To redirect Standard output
 or 
 the_command 2>&1 | tee abc.txt   # To redirect err in out and both in the file

この場合、tty でコマンドの通常の出力が得られますが、同時にログ ファイル abc.txt にコピーが保存されます。 . read -p を使用すれば、あなたのケースでは居心地が良いはずです script2 の呼び出し the_command | tee abc.txt のように .

メモと参考文献:

"[email protected]" を追加 スクリプトのすべての引数を関数に渡すことができます。

インターネット上の多くの情報源から bashredirection について詳しく読むと、興味深いことがわかるかもしれません。

  • Scott のコメントで示唆されているように、Unix SE の wiki 回答があります:良い出発点です。
  • A must the man bash または bash マニュアル。
  • bash-hackers のリダイレクトの章が役に立ちました。廃止された用途へのリンクもあります。
  • Advanced Bash-Scripting Guide の第 20 章も参照できます。

Linux
  1. プログラムの出力をZipファイルにリダイレクトする方法は??

  2. time コマンドの出力を Linux のファイルにリダイレクトする方法は?

  3. systemd サービスの出力をファイルにリダイレクトする方法

  1. Linuxで出力をファイルとStdoutにリダイレクトする方法

  2. コマンドの出力をシェル変数に割り当てる方法は?

  3. 出力をファイルに追加する方法は?

  1. system() の出力をファイルにリダイレクトする方法は?

  2. トップコマンドの出力をLinuxのファイルにキャプチャする方法は?

  3. この awk コマンドの出力をファイルに保存する方法は?