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,而是内核。
正如用户@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 会话和其他项目隔离的好处。
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...)。您可能需要调整echo或sed实用程序的路径。
| 归档时间: |
|
| 查看次数: |
4346 次 |
| 最近记录: |