質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

2回答

8570閲覧

コマンドの結果を複数のファイルにリダイレクトしたい

inu_inu

総合スコア19

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

0クリップ

投稿2019/02/04 02:12

編集2019/02/04 04:27

お世話になっております。
よろしくお願いします。

実現したいこと

bashでコマンド実行した結果をファイルに出力したいと考えています。
諸事情により、複数のファイルに結果を出力したいと思っています。
※下記コードを例とすると、TEST_1.logは実行ごとに随時上書き。TEST_2.logは処理最後に削除することで、実行ごとに随時作成。

試したこと

下記のように、リダイレクトを複数用意してみましたが、最初のリダイレクトであるTEST_1.logにしか出力されませんでした。

bash

1(psql -eh ${PSQL_HOST} -U ${PSQL_USER} -d ${PSQL_DB} 2>&1) >> TEST_1.log 2>&1 >> test_2.log 2>&1 << EOF 2 3\COPY TABLE TO '出力先パス' WITH CSV HEADER NULL AS 'null' DELIMITER E'\t' 4 5EOF

一回の処理で複数のファイルに出力する方法はありますでしょうか?
ない場合は、TEST_2.logに出力した結果を、TEST_1.logに追記していく方向で考えてみたいと思います。

追記

本処理はシェルスクリプトに記載している処理の一部となります。
テストに使用したシェルスクリプトを記載します。

bash

1#!/bin/bash 2 3PSQL_HOST=**** 4PSQL_USER=**** 5PSQL_DB=**** 6 7echo "!! START" >> TEST_1.log 2>&1 8 9(psql -eh ${PSQL_HOST} -U ${PSQL_USER} -d ${PSQL_DB} 2>&1) | tee TEST_1.log 2>&1 | tee test_2.log 2>&1 << EOF 10 11\COPY TABLE TO '出力先パス' WITH CSV HEADER NULL AS 'null' DELIMITER E'\t' 12 13EOF 14 15echo "!! END" >> TEST_1.log 2>&1 16 17exit 0

上記実行すると、下記のようなログになりました。

TEST_1.logの内容 !! START !! END
TEST_2.logの内容 \COPY TABLE TO '出力先パス' WITH CSV HEADER NULL AS 'null' DELIMITER E'\t'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

書き込まれる内容が同じで良いのであれば、teeコマンドが有用かと思います。

Bash

1(psql -eh ${PSQL_HOST} -U ${PSQL_USER} -d ${PSQL_DB} 2>&1) | tee TEST_1.log 2>&1 | tee test_2.log 2>&1 << EOF 2 34EOF

投稿2019/02/04 02:14

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inu_inu

2019/02/04 02:59

ご回答ありがとうございます。 teeコマンドを利用して実施してみましたが、test_2.logにしか出力できませんでした。 また処理の最後に"exit 0"を記載していますが、上記tee記載だとbash自体の処理が終了しませんでした…
kazto

2019/02/04 03:09

当方の手元では意図通りtest1.log、test2.log双方に出力が記載できています。 inu_inu様がteeを使って実行したコマンドラインを追記お願いします。 また、"exit 0"はご質問内容に含まれていませんが、どこから出てきたものでしょうか?
inu_inu

2019/02/04 04:33

申し訳ありません、質問の仕方が不適切でした。 本処理はバッチ処理の中に含める一部の処理でした。 追記を記載させていただきました。
otn

2019/02/04 04:57

惜しい。ヒアドキュメントは、psql コマンドに対してです。
inu_inu

2019/02/04 05:18

"<< EOF"をpsqlコマンドだけではなく、linuxコマンドに対してもつけてしまったということですね。 また、追記部分でtee TEST_1.logに対して"2>&1"を付与したことも、両ファイルに出力できない原因でした。(上記を外すと、処理は終わりませんが両ファイルに出力はできました) 質問不備があり申し訳ありませんでした。kazto様、otn様御助力ありがとうございます。
guest

0

ベストアンサー

Bash

1psql -eh ${PSQL_HOST} -U ${PSQL_USER} -d ${PSQL_DB} <<EOF 2>&1 | tee -a TEST_1.log >> test_2.log 2 3\COPY TABLE TO '出力先パス' WITH CSV HEADER NULL AS 'null' DELIMITER E'\t' 4 5EOF

ですね。

投稿2019/02/04 04:24

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/02/04 04:26

質問文のコードではログファイルに追加書きになっているので、追加書きにしています。 (tee の -a オプションを付けなければ上書きです)
inu_inu

2019/02/04 04:34

ご回答ありがとうございます。 無事に複数ファイルへ出力することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問