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
文字列に展開されます。