入力がパラメータ、ファイル、または端末から来ているかどうかを検出する方法

入力がパラメータ、ファイル、または端末から来ているかどうかを検出する方法

Bashで特定のスクリプトが呼び出されたかどうかを知る方法はありますか?

$ myscript.sh myfile

または:

$ myscript.sh < myfile

myfile一部のスクリプトでは常に with のコンテンツにアクセスします$1が、今ではさまざまな状況に応じて動作を変更したいと思います。

編集:リダイレクトなしで呼び出すときの3番目のケースも必要です。

$ myscript.sh

答え1

編集する:端末やファイルの入力を正しく検出するように-t変更されました。-t 0

ここで重要なのは、入力が端末から来るのかファイルから来るのかを知ることです。これに対するテストがあります(man test参照-t)。

bashスクリプトを実行するとします。

if [ -t 0 ]; then
    echo "Input from terminal"
    if [ $# -eq 0 ]; then
        echo "No input files specified on command line.  Error." >&2
    else
        echo "Input file given on command line.  It is $1"
    fi
else
    echo "Input coming from stdin"
fi

上記のechoステートメントを実際のコードに置き換えることで、さまざまなシナリオを処理できます。

アップデート、クイックテストスクリプト:

#!/bin/bash
[ -t 0 ] && echo "t is true" || echo "t is false"

ランニング:

$ test.sh testfile
t is true
$ test.sh < testfile
t is false
$

答え2

一般に、式$1など$2は、スクリプトのコマンドラインで指定された最初、2番目などの引数に展開されます。

したがって、スクリプトを呼び出すとき:

myscript.sh myfile

その後、$1スクリプトからmyfile(およびなど$2$3すべて空の文字列です)に展開します。

スクリプトを呼び出すとき:

myscript < myfile

STDINのリダイレクトはmyfile親シェルによって実行されるため、スクリプトは実際には次のものを使用します。いいえパラメータを指定し、空の$1文字列に展開されます。

関連情報