如何在bash脚本内重新启动shell并继续执行脚本?

问题描述 投票:0回答:1

最初的问题:安装nix包管理器,然后通过仅启动一次bash脚本使用nix安装其他程序(例如lua)。

解决方案:我编写了以下bash脚本install.sh

#!/bin/bash

install_nix() (
        echo "installing nix..."
        echo ""

        curl --location https://releases.nixos.org/nix/nix-2.18.1/install | sh -s -- --daemon

        echo ""
)

if ! command -v nix-env &> /dev/null; then
        echo "nix is not installed"

        install_nix
fi

nix-env --install --attr nixpkgs.lua

问题:脚本结果如下:

./install.sh: line 18: nix-env: command not found

因为nix包管理器需要在安装后重新启动shell

---- 提醒 -------------------------------------------------------- ---------------------------------

[ 1 ]

Nix 将无法在活动 shell 会话中工作,除非您重新启动它们。

那么我想要什么:以某种方式重新启动脚本内的 shell 并从那里继续执行,这样我就不需要重新启动 shell 并手动再次启动脚本了

我尝试过什么来解决这个问题:

1 执行bash

...
if ! command -v nix-env &> /dev/null; then
        echo "nix is not installed"

        install_nix

        exec bash
fi
...

2 执行 $0 $@

...
if ! command -v nix-env &> /dev/null; then
        echo "nix is not installed"

        install_nix

        exec @0 $@
fi
...

3 执行bash $0 $@

...
if ! command -v nix-env &> /dev/null; then
        echo "nix is not installed"

        install_nix

        exec bash @0 $@
fi
...

4 子外壳

...
if ! command -v nix-env &> /dev/null; then
        echo "nix is not installed"

        ( install_nix )
fi
...

5 命令替换 $()

...
if ! command -v nix-env &> /dev/null; then
        echo "nix is not installed"

        $(install_nix)
fi
...

6 命令替换``

...
if ! command -v nix-env &> /dev/null; then
        echo "nix is not installed"

        `install_nix`
fi
...

7只是重击

...
if ! command -v nix-env &> /dev/null; then
        echo "nix is not installed"

        bash install_nix
fi
...

8 bash + 源代码

...
if ! command -v nix-env &> /dev/null; then
        echo "nix is not installed"

        new_shell = $(bash)
        source install_nix
        disown $new_shell
fi
...

这一切都发生在 WSL Ubuntu 22.04.2 LTS 中

所以问题是:如何以某种方式重新启动脚本内的 shell 并从那里继续执行,这样就不需要重新启动 shell 并再次手动启动脚本?

linux bash ubuntu windows-subsystem-for-linux nix
1个回答
0
投票

您可以重新启动脚本,而不是

bash

exec "$0" "$@"

并且在您的脚本内检测不同的条件(即

nix
已安装)。

© www.soinside.com 2019 - 2024. All rights reserved.