scripts のコレクションが増えています 実行ではなくソースである必要があります 。現時点では彼らはシェバンを持っています
#! /bin/cat
しかし、私が行ったのと同じ方法で、実行時にそれらをbashにソースすることをお勧めします
$ . /path/to/script.sh
または
$ source /path/to/script.sh
だが .
とsource
はbashに組み込まれているので、そのようなスクリプトの代替Shebang行は可能ですか?
いいえ。シバンが登場するまでに、あなたはすでに負けています。シバンは、プロセスがexec()
されたときに適用され、通常はフォーク後に発生するため、すでに別のプロセスにいます。 Shebangを読み取るのはシェルではなく、カーネルです。
She-bangは、シェルではなく、コマンドが実行されたときにカーネルによって解釈されます。ですから、その時までには手遅れです。
代わりにそれを作ることができます:
#! /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 ...など)の1つに置き換えます。 echo
またはsed
ユーティリティのパスを調整する必要がある場合があります。
ユーザー@muruが言うように、#!
-行に到達したときにすでにシェルセッションを残しているため、これを行うことはできません。
ただし、シェルファイルの機能によっては、別の解決策がある場合があります。
彼らはあなたがいくつかのプロジェクトに使用する環境変数を設定していると思います。
プロジェクトを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
これにより、$HOME/projects
の下の指定されたプロジェクトサブフォルダーに自動的にcd
が入り、この場合(変数を初期化する)subtool.env
というプロジェクト環境ファイルを読み取り、コマンドラインプロンプトを表示します。プロジェクトを実行して、インタラクティブなbash
セッションを開始します。
[subtool: subtool] $
作業が完了したら、単にexit
。
これには、プロジェクト環境を「通常の」ログインシェルセッションや他のプロジェクトから分離するという利点もあります。
あなたの論点は何ですか?
スクリプトを単独で実行したくないですか?スクリプトをソースとする場合は、実行可能ビットを設定しないでください。シェバンでもありません。また、PATHに配置されません。
ライブbashセッションから、ドットとスペースの2つの追加文字を入力することに悩まされていませんか? エイリアスを定義するだけです。
alias script.sh='. /path/to/script.sh'
また、PATH内の実行可能ファイルと同様に、エイリアスは入力時に自動的に完了します。
PS。増加するスクリプトコレクションをPATHのように含めるには、次のようなスニペットを使用して、〜/ .bashrcにすべてのエイリアスを作成できます。
for F in $(find /path/to/collection); do alias ${F##*/}=". $F"; done