source
または「。」を追加する必要がないように、スクリプトを「ソースとして実行」するようにマークする方法はありますか? 毎回それにコマンド?つまり、「sup」というスクリプトを書く場合、次のように呼びたいと思います。
sup Argument
それよりも
source sup Argument
また
. sup Argument
cd
基本的に、スクリプト内で使用しようとしています。
source
または「。」を追加する必要がないように、スクリプトを「ソースとして実行」するようにマークする方法はありますか? 毎回それにコマンド?つまり、「sup」というスクリプトを書く場合、次のように呼びたいと思います。
sup Argument
それよりも
source sup Argument
また
. sup Argument
cd
基本的に、スクリプト内で使用しようとしています。
シェルを実行している場合、シェル スクリプトを呼び出す方法は 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"
そのエイリアスを作成します。
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) の実験でも、同じ動作が示されています。
呼び出し時にスクリプトをサブシェルする場合、現在の環境でスクリプトをソースすることはできません。
ただし、スクリプトがソースであることを確認し、そうでない場合はスクリプトを強制的に終了させることができます。
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 sourceとdon't sourceを参照してください。