./bla.sh vs.を使用してスクリプトを呼び出す bla.sh


11

以下の2つの例A)とB)で、シェルが何をするのか説明してくれる人はいますか?明らかに異なる動作をしますが、出力が異なる理由はわかりません。

例:
現在のディレクトリにbla.sh、1つのコマンドだけで名前が付けられたスクリプトを作成します。
echo ${0##/*} hello

A)次のように
開始:./bla.sh
与える:./bla.sh hello

B)次のように
開始. bla.sh
-bash hello

スクリプトでこれを使用しているので、2番目の出力(-bashの前の "-"のため)はコマンドを強制終了します。もちろん、助けになる--前に簡単です${...}が、そもそも出力の原因を理解したいと思います。
私はbashが大好きです。そしてvi [m]。しかし、私は脱線します...

回答:


22
./bla.sh

ここで、コマンドは./bla.shです。これにより、シェルbla.shは現在のディレクトリで指定された実行可能ファイルを探し、カーネルとは別のプロセスで通常のプログラムとして実行するようにカーネルに要求します。(スクリプト、1つ、またはコンパイルされたバイナリであるかどうかbla.shは関係ありません。)bashperlpython


. bla.sh

ここで、コマンドは.(別名source)、シェルの組み込みコマンドです。これにより、シェルbla.shはシステムパス($ PATH)で指定されたファイルを検索し、ユーザーが入力したかのように内容を解釈します。これらはすべて、シェル自体と同じプロセスで実行されます(したがって、シェルの内部状態に影響を与える可能性があります)。

もちろん、これはシェルbla.sh用のコマンドが含まれている場合bash(現在使用している場合)にのみ機能し、perlスクリプトなどには機能しません。

(これについても説明されhelp .ていhelp sourceます。)


通り../は完全に異なるもの(パスの一部VSコマンド)している、彼らはもちろん、組み合わせることができます-使用して. ./bla.shだろう「ソース」ファイルbla.sh現在のディレクトリにします。


通常、この./bla.sh方法を使用するのが最善です。のみ~/.bashrc~/.profile彼らは現在の環境を変更することになっているので、そのようなファイルは、通常、供給されています。


3
さらに、bla.shでbash環境を変更すると、これらの変更はの後に考慮されます。bla.shですが、。/ bla.shの後ではありません。それの訳は 。bla.shは現在のbashのコンテキストで実行されますが、。/ bla.shはサブプロセスとして実行されます。
ムービシエル

1
いくつかの例については、mywiki.wooledge.org / BashFAQ / 060も参照してください。sourceはのbashエイリアス.であり、逆でsourceはなく、他のシェルでは機能しないことに注意してください。
mrucci

7

./<cmd>実行される<cmd>プログラムを新しい(フォーク)プロセスの現在のディレクトリに存在しています。実行可能でなければなりません。また、読み取り可能#!です。

. <cmd>現在のシェルに、現在のシェルプロセスの現在のディレクトリまたは現在のディレクトリにあるシェルスクリプト<cmd>を実行させます。読み取り可能でなければなりません。これは、シェルコマンドのエイリアスです。$PATHsource


-1 . <cmd>はプログラムを探し、$PATH見つからない場合は現在のディレクトリを探します。
ドッグベイン

@dogbaneそうですね、これを修正しました。
kmkaplan

FWIW、すべてのシェルがソーススリップのcwdを検索するわけではありません。zshの(設定で、少なくとも私が持っている)が必要です. ./cmd
bstpierre

1
@bstpierreこれは感動的な地面のようです。私が持っているPOSIXのリファレンスでは、「シェルはPATHで指定された検索パスを使用する」と「PATHの値で許可されていない場合でも、一部の古い実装では現在のディレクトリでファイルを検索しました」と述べています。
kmkaplan

1

./cmd./実行可能ファイルへの 明示的なパス(-現在のディレクトリ)を使用します。そして、で始まる必要はありません#!

. cmd-(別名source)-bash組み込みコマンド。実行の目に見える違いの1つsourceは、現在のシェルの環境変数を設定/変更できることです。


より正確には、sourcebashの専用エイリアスである.(標準である)
user1686

あなたが正しいです。修繕。
レオニードヴォルニツキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.