23

sourceまたは「。」を追加する必要がないように、スクリプトを「ソースとして実行」するようにマークする方法はありますか? 毎回それにコマンド?つまり、「sup」というスクリプトを書く場合、次のように呼びたいと思います。

sup Argument

それよりも

source sup Argument

また

. sup Argument

cd基本的に、スクリプト内で使用しようとしています。

4

4 に答える 4

24

シェルを実行している場合、シェル スクリプトを呼び出す方法は 2 つあります。

  • スクリプトを実行すると、スクリプトが実行されている新しいプロセスが生成されます。これは、スクリプト名を入力することで実行できます。スクリプトが実行可能になっていて、

    #!/bin/bash
    行、または直接呼び出す
    /bin/bash mycmd.sh

  • スクリプトを取得すると、その親シェル (つまり、コマンドを入力しているシェル) 内でスクリプトが実行されます。これは、入力することによって行われます

    source mycmd.sh
    また
    . mycmd.sh

したがって、ソース化されていないシェル スクリプト内の cd は、プロセスの分離に違反するため、親シェルに伝播することはありません。

CD だけに関心がある場合は、cdの「ショートカット」を使用してスクリプトを取り除くことができます... bash doc の CDPATH env var.

それ以外の場合は、エイリアスを使用して、source または .: の代わりに単一のコマンドを入力できます。

alias mycmd="source mycmd.sh"
于 2009-04-15T16:31:35.120 に答える
10

そのエイリアスを作成します。

alias sup=". ~/bin/sup"

またはそれらの線に沿って。

参照: bash シェル スクリプトで cd が機能しないのはなぜですか?


反例によるコメントへの回答: Solaris 10 での Korn Shell の実験では、次のことができることが示されています。

$ pwd
/work1/jleffler
$ echo "cd /work5/atria" > $HOME/bin/yyy
$ alias yyy=". ~/bin/yyy"
$ yyy
$ pwd
/work5/atria
$

Solaris 10 での Bash (3.00.16) の実験でも、同じ動作が示されています。


于 2009-04-15T16:26:07.770 に答える
7

呼び出し時にスクリプトをサブシェルする場合、現在の環境でスクリプトをソースすることはできません。

ただし、スクリプトがソースであることを確認し、そうでない場合はスクリプトを強制的に終了させることができます。

if [ -z "$PS1" ] ; then
    echo "This script must be sourced. Use \"source <script>\" instead."
    exit
fi

同様に、スクリプトをソースではなくサブシェルにすることもできます (現在のシェル環境を維持します)。

if [ "$PS1" ] ; then
    echo "This script cannot be sourced. Use \"./<script>\" instead."
    return
fi

どちらのバージョンも Gist として利用できます: Please sourcedon't sourceを参照してください。

于 2016-03-24T10:41:49.913 に答える