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

jal*_*anb 5 shell bash shell-script shebang

我有一个不断增长的收集脚本应该来源,无法运行。目前他们有shebang

#! /bin/cat
Run Code Online (Sandbox Code Playgroud)

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

$ . /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

或者

$ source /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

但是,.source是bash的内置命令,所以对这些脚本的替代家当线可能吗?

mur*_*uru 15

不。当shebang开始发挥作用时,您已经输了。当一个进程被exec()'d 并且通常在分叉之后发生时应用 shebang ,所以你已经在一个单独的进程中。读取shebang的不是shell,而是内核。


Kus*_*nda 5

正如用户@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
Run Code Online (Sandbox Code Playgroud)

运行:

$ ./project-env subtool
Run Code Online (Sandbox Code Playgroud)

这将自动cd进入下面的给定项目子文件夹$HOME/projects,读取subtool.env在这种情况下调用的项目环境文件(在其中初始化变量),为您提供项目的命令行提示并让您进入交互式bash会话:

[subtool: subtool] $
Run Code Online (Sandbox Code Playgroud)

完成工作后,只需exit.

这还具有将项目环境与“普通”登录 shell 会话和其他项目隔离的好处。


Sté*_*las 5

she-bang 在执行命令时由内核解释,而不是由 shell 解释。所以,到那个时候,已经晚了。

你可以改为:

#! /bin/echo Please run (from a Bourne-like shell): .
Run Code Online (Sandbox Code Playgroud)

或者:

#! /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
Run Code Online (Sandbox Code Playgroud)

告诉用户他们做错了什么。

这应该适用于 Linux。在其他一些操作系统上,将除第一个空格以外的所有空格替换为一个非 ASCII 间距字符(如 U+00A0、U+2006...)。您可能需要调整echosed实用程序的路径。