web-dev-qa-db-ja.com

Shebangを使用して、ファイルソース自体を現在のbash環境に入れることはできますか?

scripts のコレクションが増えています 実行ではなくソースである必要があります 。現時点では彼らはシェバンを持っています

#! /bin/cat

しかし、私が行ったのと同じ方法で、実行時にそれらをbashにソースすることをお勧めします

$ . /path/to/script.sh

または

$ source /path/to/script.sh

だが .sourceはbashに組み込まれているので、そのようなスクリプトの代替Shebang行は可能ですか?

3
jalanb

いいえ。シバンが登場するまでに、あなたはすでに負けています。シバンは、プロセスがexec()されたときに適用され、通常はフォーク後に発生するため、すでに別のプロセスにいます。 Shebangを読み取るのはシェルではなく、カーネルです。

12
muru

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ユーティリティのパスを調整する必要がある場合があります。

5

ユーザー@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

これには、プロジェクト環境を「通常の」ログインシェルセッションや他のプロジェクトから分離するという利点もあります。

5
Kusalananda

あなたの論点は何ですか?

スクリプトを単独で実行したくないですか?スクリプトをソースとする場合は、実行可能ビットを設定しないでください。シェバンでもありません。また、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
0
guest