お世話になっております。
シェルスクリプト(A.sh)から別のシェルスクリプト(B.sh)を呼び出した場合の標準入力の処理についてです。
問題点
A.shはコマンドライン引数が必要で、 $ A.sh string
のように使います。
B.shはコマンドライン引数やオプションを必要し、またtestコマンドで標準入力がパイプかどうかを判定し処理内容を変更しています。
B.sh単体での実行は問題ありませんが、A.shから呼び出す場合、B.sh内でパイプと判定され、正しく処理できません。
こうしたい
B.sh単体およびA.shからB.shを呼び出した場合でも正しく標準入力を受け取りたい。
スクリプト
B.shは以下のように使います。
console
1# 入力ファイルを用意する場合 2$ B.sh -p P -t T in.txt > out.txt 3 4# 標準入力で処理する場合 5$ cat in.txt | B.sh -p P -t T - > out.txt
B.shは以下のように[ -p /dev/stdin ]
で場合分けしています。
Bash
1#!/usr/bin/env bash 2if [ -p /dev/stdin ]; then 3 data=$( cat - ) 4else 5 data=$( cat ${infile} ) 6fi
A.shは以下のように使います。なお、実際はA.shも別のプログラム (perl)からsystemを用いて呼び出しています
console
1$ A.sh aaa.txt
A.shは以下のようなスクリプトです
Bash
1bash B.sh -p $arg_P -t $arg_T ${infile} > ${outfile}
この場合に、A.shを実行するとB.shで標準入力がパイプと判定されてしまいます。
質問が拙くて申し訳なく思います。
ご質問やご不明点がございましたらコメントください。よろしくお願いします。