最初的问题:安装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 并再次手动启动脚本?
您可以重新启动脚本,而不是
bash
exec "$0" "$@"
并且在您的脚本内检测不同的条件(即
nix
已安装)。