在当前bash(sh)中执行脚本和注册函数

这篇具有很好参考价值的文章主要介绍了在当前bash(sh)中执行脚本和注册函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在研究《管理Python虚拟环境的脚本》时,我们使用了source指令而没有使用sh或者bash来执行脚本,就是因为source指令可以让脚本在当前bash(sh)中执行;而sh或者bash则会新启动一个bash来执行。
在当前bash(sh)中执行脚本和注册函数,bash,linux,unix
我们可以通过下面这个脚本做测试

# test.sh
# 用一个数组保存进程ID和进程名
processInfo=()

# 查找父进程的进程号
findParentID() {
    if [ $1 = $2 ]; then
        # 如果父进程号等于目标进程号,说明已经找到了父进程
        # 打印所有进程信息
        echo "processInfo: ${processInfo[@]}"
        return
    else
        # 获取当前进程的父进程号
        parentID=$(ps -o ppid= $1)
        # 获取父进程的名字
        parentName=$(ps -o comm= $parentID)

        # 将父进程号和父进程名保存到数组中
        processInfo+=($parentID $parentName)

        findParentID $parentID $2
    fi
}

currentName=$(ps -o comm= $$)
processInfo+=($$ $currentName)
findParentID $$ $1

bash

bash test.sh $$

processInfo: 45322 bash 40883 bash

当前bash的进程ID是40883,新启动的bash的进程ID是45322。

source

source test.sh $$

processInfo: 40883 bash

可以见得没有启动新的bash程序。
source还可以让自动注册脚本中的函数。
比如上面指令让脚本中的findParentID方法可以直接被使用。

findParentID $$ $$

processInfo: 40883 bash

相似的应用在Python虚拟环境中也有体现。
比如我们启动一个虚拟环境,使用下面的命令

source .env/bin/activate

在当前bash(sh)中执行脚本和注册函数,bash,linux,unix
而退出虚拟环境的方法deactivate则注册在.env/bin/activate文件中

# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly

deactivate () {
    # reset old environment variables
    if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
        PATH="${_OLD_VIRTUAL_PATH:-}"
        export PATH
        unset _OLD_VIRTUAL_PATH
    fi
    if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
        PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
        export PYTHONHOME
        unset _OLD_VIRTUAL_PYTHONHOME
    fi

    # This should detect bash and zsh, which have a hash command that must
    # be called to get it to forget past commands.  Without forgetting
    # past commands the $PATH changes we made may not be respected
    if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
        hash -r 2> /dev/null
    fi

    if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
        PS1="${_OLD_VIRTUAL_PS1:-}"
        export PS1
        unset _OLD_VIRTUAL_PS1
    fi

    unset VIRTUAL_ENV
    unset VIRTUAL_ENV_PROMPT
    if [ ! "${1:-}" = "nondestructive" ] ; then
    # Self destruct!
        unset -f deactivate
    fi
}

# unset irrelevant variables
deactivate nondestructive

VIRTUAL_ENV="/home/fangliang/numpy-example/.env"
export VIRTUAL_ENV

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

# unset PYTHONHOME if set
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
# could use `if (set -u; : $PYTHONHOME) ;` in bash
if [ -n "${PYTHONHOME:-}" ] ; then
    _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
    unset PYTHONHOME
fi

if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
    _OLD_VIRTUAL_PS1="${PS1:-}"
    PS1="(.env) ${PS1:-}"
    export PS1
    VIRTUAL_ENV_PROMPT="(.env) "
    export VIRTUAL_ENV_PROMPT
fi

# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands.  Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
    hash -r 2> /dev/null
fi

如果我们使用bash来执行,则因为虚拟环境会在新启动的bash中存在,并会快速退出。回到我们原来的bash中时,已经不是虚拟环境了。相应的deactivate方法也没注册到环境中。
在当前bash(sh)中执行脚本和注册函数,bash,linux,unix
所以如果我们希望脚本对当前bash有所影响,就要使用source去执行脚本;如果不希望影响当前bash,则可以使用bash或者sh去执行。
需要注意的是,bash并不等价于sh。sh(Bourne Shell)是1978年由史蒂夫·伯恩编写的shell;bash(Bourne-Again Shell)是1987年由布莱恩·福克斯为GNU计划编写的Unix shell。主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,是各种Linux发行版标准配置的Shell。比如上面test.sh使用bash可以正确执行,而sh执行就会报错。文章来源地址https://www.toymoban.com/news/detail-809744.html

到了这里,关于在当前bash(sh)中执行脚本和注册函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】为.sh脚本制作桌面快捷方式(.desktop,可双击执行),且替换显示图标(图文详情)

    目录 0.背景+环境 1、原理 2、详细步骤  1)创建.desktop快捷方式 2) 给test.desktop快捷方式增加可执行权限 3)编辑test.desktop内容和参数 4)修改快捷方式属性为双击可执行 5)将桌面快捷方式发送到桌面 ubuntu 16.04 项目需求,目前有一个可执行程序(test.sh),test.sh这个脚本是执

    2024年02月13日
    浏览(43)
  • Windows 下 bat 脚本调用 Git bash 环境 sh 脚本

    D:InstallGit start.sh 脚本 双击 start.bat 我们下期见,拜拜!

    2024年04月25日
    浏览(47)
  • 【Linux命令-shell】虚拟机中创建shell脚本、查看当前路径、执行脚本

    目录 一、创建shell脚本 二、查看当前的路径 三、执行脚本 一、创建shell脚本 shell脚本的特点 提前将可执行的命令语句写入一个文件中 顺序执行 解释器逐行解释代码 常见的脚本有:shell、python、PHP...... 注:用什么解释器就是什么脚本 编写shell脚本: 步骤: 1、新建文件 2、

    2024年02月05日
    浏览(63)
  • sh与bash:Shell脚本中的微妙差异

    在Unix和Linux的世界中,Shell是用户与操作系统交互的主要界面。Shell提供了命令行界面,使得用户能够执行各种命令和操作。在众多的Shell中,sh和bash是最常见且使用最广泛的两种。尽管它们在很多方面相似,但在功能、特性和语法上,它们之间仍存在一些微妙的差异。 一、起

    2024年04月15日
    浏览(52)
  • windows下在cmd和git bash中执行bash download.sh失败

    cmd报错信息: 解决办法: win64-wget-1.21.4 安装软件wget,如下这是64位的包,解压后,下面有个wget.exe,拷贝到C:WindowsSystem32、 然后打开cmd,执行wget -V 如上,有版本信息就OK了。 再一次进入git bash中执行bash download.sh,下载成功:

    2024年02月02日
    浏览(34)
  • Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory

    运行bash脚本会出现两个文件, 1037.err 和 1037.out 。 1037.err的文件内容如下: /data/home/user12/.lsbatch/1694577957.1037: /data/home/user12/.lsbatch/1694577957.1037.shell: /bin/sh^M: bad interpreter: No such file or directory 第一步 执行命令行:cat -A xxx.sh 第二步 使用下述命令直接替换结尾符为unix格式 命令行

    2024年02月07日
    浏览(45)
  • 【Unity3D】Unity 脚本 ③ ( C# 脚本的执行入口函数 | 获取当前游戏物体及物体名称 | 获取游戏物体的 Transform 组件数据 | UnityEngine 命名空间简介 )

    在 C# 脚本中控制 游戏物体 GameObject 运动 , 要先获取该物体 , 然后 修改其 Transform 组件的属性 ; 在 游戏开始运行后 , 会自动执行 游戏物体 GameObject 上的 C# 组件代码 , 程序入口是 MonoBehaviour#Start() 函数 ; 在 C# 脚本中 , 主要的内容都在 Start() 函数 中实现 ; 在 C# 脚本中 , 游戏物体

    2023年04月12日
    浏览(81)
  • 使用java执行bat、sh脚本文件

    在工作中,由于需求,需要完成让java去调用.bat文件和.sh文件的操作,接下来开始编码 此处用到了糊涂工具类 maven如下 由此代码来执行bat或sh脚本文件(PS:糊涂工具包用不用无所谓,只是用来判断是否为windows系统的)

    2024年02月12日
    浏览(50)
  • nginx配置sh脚本远程执行一键安装

    本地多机重复操作某些shell指令,分步执行,很耗费时间, 需要远程一键部署,傻瓜化运维,更为通用安装。 即参考docker通用安装 总体思路: 1、容器化nginx部署; 2、准备好要访问的目录,这里是一个文件夹,映射到nginx里面; 3、修改nginx配置,默认映射到2中的目录; 4、

    2024年02月01日
    浏览(43)
  • Linux 系统查看当前正在运行的某个进程的详细执行脚本和目录ls -l /proc/PID/cwd和 ls -l /proc/PID/exe

    首先使用 ps 命令查看当前正在运行的某个进程的 PID,例如: 这个命令会列出所有包含 your_process_name 信息的进程ID(也就是PID)和进程名称。你需要根据进程的名称来找到你想要查看的进程对应的PID。 然后进入 /proc 目录,你可以使用以下命令查看该 PID 对应的执行脚本: 其

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包