我可以使用 shebang 將文件來源本身放入目前的 bash 環境中嗎?

我可以使用 shebang 將文件來源本身放入目前的 bash 環境中嗎?

我的收藏越來越多腳本哪個應該獲取,而不是運行。現在他們有shebang

#! /bin/cat

但我更希望在運行時將它們源到 bash 中,就像我所做的那樣

$ . /path/to/script.sh

或者

$ source /path/to/script.sh

但是.source是 bash 內建函數,那麼此類腳本的替代 shebang 行是否可能?

答案1

不。 Shebang 在進程建立時應用exec(),通常在分叉後發生,因此您已經處於單獨的進程中。讀取 shebang 的不是 shell,而是核心。

答案2

當執行命令時,she-bang 由核心解釋,而不是由 shell 解釋。所以,到那個時候,已經太晚了。

你可以改為:

#! /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 時您已經離開了 shell 會話#!

但是,根據您的 shell 檔案的用途,可能還有另一種解決方案。

我猜他們設定了您用於某些項目的環境變數。

讓我們稱之為一個專案subtool(因為這是我的一個專案)。然後您可以有一個為專案設定 shell 環境的腳本,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

這也具有將專案環境與「普通」登入 shell 會話以及其他項目隔離的好處。

答案4

您想要在這些 .'ed 腳本中執行的操作是更改 shell 進程;所以你需要從 shell 進程中呼叫它們;這意味著要么是別名,要么是它們更強大的兄弟 shell 函數。這意味著您必須在 .profile 或等效檔案中進行一些設定。

別名技巧有點簡單:alias mytool1="./my/library/mytool1.sh"

你能從一開始就讀完所有內容嗎? 。 /我的/庫/define_tools.sh

Define_mytools.sh: mytool1() { ... mytool1.sh 的內容 ... } mytool2() { ...; }

相關內容