非対話型シェルを起動すると、何かが常に実行されていることをどのように確認できますか?

非対話型シェルを起動すると、何かが常に実行されていることをどのように確認できますか?

スクリプトがあるとしましょう。

#!/bin/bash
whoami

fooこのスクリプトを実行するときは、常に実行前に印刷するようにしたいと思います。実際、私はfooスクリプトが実行される前に印刷したいと思います(この例だけではありません)。

このファイルを試してみましたが、うまくbashrcいかないようです。

case $- in
    *i*) echo "foo";;
      *) return;;
esac

答え1

~/.bashrcbashposixモードで実行されていない非ログインの対話型呼び出しによってのみ解釈されます。

bashを呼び出すたびに解釈されるファイルの場合(posixモードで実行されているファイルを除く)、次のものを使用できます$BASH_ENV

$ cat ~/.bashenv
if [[ $- != *i* ]]; then
  echo foo
fi
$ export BASH_ENV=~/.bashenv
$ bash -c 'echo bar'
foo
bar

これがecho foo単にbashの解釈のためのものであればスクリプト、つまりbash呼び出されたときbash /path/to/file#! /bin/bashshebangを使用するか、より正確な#! /bin/bash -形式)他の形式の非対話型シェル呼び出し(例:(bash -c codeコードの実行時に、、GNU ...によって実行される)、または)の代わりに変更できます。xtermviparallel$SHELLbash < file[[ $- != *i* ]][[ $- != *[ics]* ]]

zshに対応するのは~/.zshenv(または$ZDOTDIR/.zshenv)です。

パスしない限り、すべてのcsh / tcshはread()を呼び出します~/.cshrc(これがほとんどのcshスクリプトにshebangがある理由です)。~/.tcshrc-f#! /bin/csh -f

kshは準拠していましたが、$ENVセキュリティ上の理由から非対話型シェルでは中断されました($ENV対話型呼び出し処理は依然としてPOSIX要件であり、シェルカスタムshファイルを持つことができる唯一の方法です)。


¹ asで呼び出されたときsh、環境があるとき、$POSIXLY_CORRECTまたはSHELLOPTS=posixwihで呼び出されたときと同じです-o posix~/.bashrc一部のbashバージョンを使用してsshを介して非対話型呼び出しを実行すると、bashシェルで解釈されることもあります。 Bash起動ファイルの処理は少し混乱しています。

関連情報