2016-09-28 23 views
0

"出力ファイルが指定されていない場合は標準出力に出力する"という動作を自分のBASHスクリプトでエミュレートできますか?bash:ファイルが指定されていない場合にファイルまたは標準出力に出力する

たとえば、のような動作をエミュレートしたいと思います。 UNIXユーティリティsort

悲しいこと
sort input 
# prints to stdout 

sort -o out input 
# prints to file "out". does not print to stdout. 

、私が思いついた唯一の事は私のbashスクリプトの最後に、次のとおりです。

if [ ! -z "$OUT" ]; then 
    some | commands > $OUT 
else 
    some | commands 
    # prints to stdout 
fi 
+0

あなたのスクリプトに引数 '$'をチェックするだけです。それが存在する場合はそれに書き込み、それ以外の場合はstdout – anubhava

答えて

1

あなたの異議は、コマンドの繰り返しにある場合、他のファイル名が指定されていない場合は、/dev/stdoutをリダイレクトのファイル名として使用できます。

output=${OUT:-/dev/stdout} 
some | commands > "$output" 
+0

に書き出します。これはスクリプトの最後の行でなければなりませんか?この後にコマンドを置くことができます(例えば、テンポラリファイルを削除する、何かを標準エラー出力する) – cmo

+1

どこでも使用できます。 '/ dev/stdout'は、ファイルシステムに'/dev/stdout'が実際に存在するかどうかに関わらず、リダイレクション演算子と共に使用されたときに、bashが標準出力の同義語として認識する特別な名前です。 – chepner

1

"-o"がある場合は、シェルスクリプト内のすべての出力をログファイルにリダイレクトするか、stdoutに出力します。あなたはもっとして1を使用していない場合でもgetoptsは使用を避けることができますが、「parse.sh」として上記のスクリプトに名前を付ける場合は、あなたが

./parse.sh -o output.txt #This will store all logs/echos inside "output.txt" 
./parse.sh #This will print all the logs/echos to stdout 

を使用する必要があります

#!/bin/bash 

OPTIND=1 
LOG_FILE="" 
while getopts "o:" opt; do 
    case "$opt" in 
    o) LOG_FILE=$OPTARG 
     ;; 
    esac 
done 

shift $((OPTIND-1)) 
[ ! -z $LOG_FILE ] && exec >$LOG_FILE 

echo "This line will be inside log file if -o <filename> is given" 

、それについては、以下のスクリプトを試してみてください"$ 1"に直接アクセスして引数を入力してください

関連する問題