シェルスクリプトをコマンドラインからしか実行できないようにしたい


シェルスクリプトをコマンドラインからしか実行できないようにしたいです。

そこで思いついたのが、pythonで見たことある以下の書き方です。  
(importでは実行されないようにしている）

[code]

    if __name__ == '__main__':
        pass
    
[/code]

シェル（bashを想定）でもこんな簡単に出来るでしょうか。  
また、そもそも別の方法があればご教示頂きたいです。

特殊変数の$0と実ファイル名を比較する方法だと、実ファイル名を変更した時にスクリプト内のファイル名も修正しないといけない気がしてます。そこで上記のpythonのようなやり方が  
ベストかなと思いついたところです。

よろしくお願いします。




bashのバージョンが3以上であれば、`BASH_SOURCE`が使えると思います:

[code]

    #!/bin/bash
    [ "${0}" = "${BASH_SOURCE[0]}" ] || return 0
    
[/code]

冒頭に入れておけばスクリプトが`source`された時にreturnします。

* * *

追記: 他のスクリプトの中で実行されるパターンを潰すのであれば、親プロセスから実行コマンドを確認するのがスマートかなぁと思います。

[code]

    #!/bin/sh
    [ "`ps -o comm= $PPID`" = "-bash" ] || exit 1
    
[/code]

bashの前についているハイフン`-`はログインシェルを意味します。

[code]

    $ man bash | less '+/^[ ]*exec '
    
[/code]

> If the -l option is supplied, the shell places a dash at the begin-ning of  
>  the zeroth arg passed to command. This is what login(1) does.




bashのバージョンが3以上であれば、`BASH_SOURCE`が使えると思います:

[code]

    #!/bin/bash
    [ "${0}" = "${BASH_SOURCE[0]}" ] || return 0
    
[/code]

冒頭に入れておけばスクリプトが`source`された時にreturnします。

* * *

追記: 他のスクリプトの中で実行されるパターンを潰すのであれば、親プロセスから実行コマンドを確認するのがスマートかなぁと思います。

[code]

    #!/bin/sh
    [ "`ps -o comm= $PPID`" = "-bash" ] || exit 1
    
[/code]

bashの前についているハイフン`-`はログインシェルを意味します。

[code]

    $ man bash | less '+/^[ ]*exec '
    
[/code]

> If the -l option is supplied, the shell places a dash at the begin-ning of  
>  the zeroth arg passed to command. This is what login(1) does.

