私のコレクションが増えています。スクリプトどの実行しないでください。。今彼らはshebangを持っています
#! /bin/cat
しかし、私が行ったように、実行時にbashにソースを提供することを好みます。
$ . /path/to/script.sh
または
$ source /path/to/script.sh
しかし、bashが組み込まれている.
のでsource
、そのようなスクリプトの代替shebang行は可能ですか?
答え1
いいえ。 Shebangが登場すると、すでに敗北したのです。 Shebangはプロセス作成時に適用されますexec()
。これは通常、分岐後に発生するため、すでに別のプロセスにあります。 shebangを読むのはシェルではなくカーネルです。
答え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で動作する必要があります。他のオペレーティングシステムでは、最初のスペースを除くすべてのスペースを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
これらの.'edスクリプトで実行したいことは、シェルプロセスを変更することです。したがって、これをシェルプロセスで呼び出す必要があります。これは、エイリアスまたはより強力な兄弟シェル機能を意味します。これは、.profileまたは同等のファイルでいくつかの設定を指定する必要があることを意味します。
エイリアスのトリックは少し簡単です: alias mytool1="./my/library/mytool1.sh"
最初からすべて読むことができますか? 。概要: 。 /my/library/define_tools.sh
Define_mytools.sh: mytool1() { ... mytool1.sh の内容... } mytool2() { ... }