gpt4 book ai didi

linux - 获取 bash 脚本来更新父 shell 的环境

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:31 26 4
gpt4 key购买 nike

我正在尝试编写一个安装后立即可用的 bash 命令行工具,即在调用其安装脚本的同一个 shell 中。假设 install-script.sh(专为 Ubuntu 设计)看起来像:

# Get the script's absolute path:
pushd `dirname $0` > /dev/null
SCRIPTPATH=`pwd`
popd > /dev/null

# Add lines to bash.bashrc to export the environment variable:
echo "SCRIPT_HOME=${SCRIPTPATH}" >> /etc/bash.bashrc
echo "export SCRIPT_HOME" >> /etc/bash.bashrc

# Create a new command:
cp ${SCRIPTPATH}/newcomm /usr/bin
chmod a+x /usr/bin/newcomm

想法是新命令 newcomm 使用 SCRIPT_HOME 环境变量来引用主脚本——它也在 SCRIPTPATH 中:

exec "${SCRIPT_HOME}/main-script.sh"

现在,更新的 bash.bashrc 还没有加载到父 shell 中。更糟糕的是,我无法从脚本中 source 它 - 它在子 shell 中运行。使用 export 更改父 shell 中的 SCRIPT_HOME 充其量只是解决问题,但即使这样也是不可能的。另请注意,安装脚本需要使用 sudo 运行,因此无法使用 source 从父 shell 调用它。

这应该是可能的,因为像 apt 这样的包管理器可以做到这一点。是否有稳健的方法来修补我的方法?这通常是如何完成的,是否有编写 bash 安装程序的良好指南?

最佳答案

你不能。 apt 也不能。

包管理器只会将所需的数据/变量写入文件,这些文件由程序本身、程序的补丁或包装器读取。

可以在 /etc/default/* 中找到很好的例子。这些是具有变量定义的文件,有些甚至有助于描述它们的来源:

$ cat /etc/default/ssh
# Default settings for openssh-server. This file is sourced by /bin/sh from
# /etc/init.d/ssh.

# Options to pass to sshd
SSHD_OPTS=

您会注意到在安装软件包后,您当前的 shell 中没有设置任何选项,因为程序以某种方式直接从文件中获取它们。

关于linux - 获取 bash 脚本来更新父 shell 的环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38730645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com