我可以使用 shebang 将文件源本身放入当前的 bash 环境中吗?

我可以使用 shebang 将文件源本身放入当前的 bash 环境中吗?

我的收藏越来越多脚本哪个应该获取,而不是运行。现在他们有shebang

#! /bin/cat

但我更希望在运行时将它们源到 bash 中,就像我所做的那样

$ . /path/to/script.sh

或者

$ source /path/to/script.sh

但是.source是 bash 内置函数,那么此类脚本的替代 shebang 行是否可能?

答案1

不。当 Shebang 发挥作用时,你就已经输了。 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() { ...; }

相关内容