私のコレクションは増え続けていますスクリプトどれの実行するのではなく、ソースを取得する必要がある現時点では彼らは
#! /bin/cat
しかし、私は実行時にbashにソース化することを好みます。
$ . /path/to/script.sh
または
$ source /path/to/script.sh
しかし.
、 と はsource
bash の組み込み関数なので、そのようなスクリプトに代わる shebang 行は可能でしょうか?
答え1
いいえ。シェバンが機能する頃には、すでに負けています。シェバンはプロセスが実行exec()
されたときに適用され、通常はフォーク後に発生するため、すでに別のプロセスになっています。シェバンを読み取るのはシェルではなく、カーネルです。
答え2
シバンは、コマンドが実行されたときにシェルではなくカーネルによって解釈されます。そのため、その時点では手遅れです。
代わりに次のようにすることもできます:
#! /bin/echo Please run (from a Bourne-like shell): .
または:
#! /bin/sed 2,5!d;s/^#.//
# This script must be sourced from within a shell
# and not executed. For instance with:
#
# . path/to/that/script
rest of the script
ユーザーに何が間違っていたかを伝えるため。
これは Linux では動作するはずです。他の OS では、最初のスペースを除くすべてのスペースを非 ASCII スペース文字 (U+00A0、U+2006 など) に置き換えます。またはユーティリティのパスを変更する必要がある場合がありecho
ますsed
。
答え3
ユーザー @muru が言うように、-line に到達したときにすでにシェル セッションが残されているため、これを行うことはできません#!
。
ただし、シェル ファイルの動作によっては、別の解決策がある可能性があります。
何らかのプロジェクトで使用する環境変数を設定するものだと思います。
プロジェクトを呼び出しましょうsubtool
(これは私が持っているプロジェクトです)。次に、プロジェクトのシェル環境を設定するスクリプトを作成できます。project-env
例:
#!/bin/bash
PROJECT="$1"
PROJECT_ROOT="$HOME/projects/$PROJECT"
cd "$PROJECT_ROOT" || exit 1
source "$PROJECT.env"
export PS1="[$PROJECT: \W] \$ "
exec bash -i
実行:
$ ./project-env subtool
これによりcd
、 の下にある指定されたプロジェクト サブフォルダーに自動的に移動し$HOME/projects
、この場合は と呼ばれるプロジェクト環境ファイルsubtool.env
(変数を初期化するファイル) が読み込まれ、プロジェクトのコマンド ライン プロンプトが表示され、対話型セッションが開始されますbash
。
[subtool: subtool] $
作業が完了したら、単にexit
.
これには、プロジェクト環境を「通常の」ログイン シェル セッションや他のプロジェクトから分離できるという利点もあります。
答え4
これらの . で区切られたスクリプトで実行したいことは、シェル プロセスを変更することです。そのため、シェル プロセスからスクリプトを呼び出す必要があります。つまり、エイリアスか、より強力なシェル関数のいずれかを使用します。つまり、.profile または同等のファイルで何らかの設定を行う必要があります。
エイリアスのトリックは、かなり単純です: alias mytool1=". /my/library/mytool1.sh"
最初にすべて読み込んでいただけますか? .profile: . /my/library/define_tools.sh
define_mytools.sh: mytool1() { ... mytool1.sh の内容 ... } mytool2() { ...; }