我在 Steam Deck 上运行 Arch Linux。 Steam Deck 有一个只读根文件系统,这迫使您使用 Flatpak,或者以清除基于 pacman 的安装为代价使文件系统可写每次他们更新 Deck 的软件时。
我不是 Flatpak 的粉丝,我更喜欢 Nix,尤其是因为它有我需要的 Flatpak 没有的软件包。
Nix 允许您运行整个包管理器,而无需从 chroot 监狱使用 root 访问权限nix 用户 chroot公用事业。
安装后,进入 chrooted nix 环境的命令nix-user-chroot ~/.nix bash -l
在新 shell 中运行良好:
但是,如果我在末尾粘贴完全相同的行,.bashrc
我会感到恐慌:
这似乎与我运行该命令两次时发生的错误完全相同:
请记住,Steam Deck 的 shell 似乎已经在 chroot 监狱中运行,根据这项技术为了查明我是否已经 chroot(nix-user-chroot ~/.nix bash -l
在我的 bashrc 中不运行):
所以我的问题是,如何自动运行nix-user-chroot ~/.nix bash -l
以便为每个终端调用它?
答案1
正如muru在评论中提到的,问题是第一次执行nix-user-chroot ~/.nix bash -l
工作正常,但会产生一个新的shell,它再次尝试执行nix-user-chroot
等。解决方案是将其放入nix-user-chroot
if子句中,检查nix环境是否已经加载,例如跑步
if [ -z "${NIX_PROFILES}" ]; then
./nix-user-chroot ~/.nix bash -l
fi
后.bashrc
加载您的 nix 配置文件(安装程序在或文件中添加了一行.profile
)。
答案2
Settings
我做了一些不同的事情,并将->中的 Konsole 命令更改Edit Current Profile...
为:
/bin/bash -c "~/.local/bin/nix-user-chroot ~/.nix bash"
我必须创建一个新的配置文件,因为该Vapor
配置文件是只读的。
它几乎做同样的事情。它仅在 Konsole 中,所以如果我这样做,我的 bash 仍然可以工作,以防我需要修复某些东西:)
然后,对于应用程序,我创建一个可执行的 bash 脚本,并使用以下内容~/.local/bin/<YOURAPPNAME>
使其可执行:chmod +x ~/.local/bin/<YOURAPPNAME>
#! /usr/bin/env bash
~/.local/bin/nix-user-chroot ~/.nix ~/.nix-profile/bin/<YOURAPPNAME>
对于桌面使用,我创建~/.local/share/applications/<YOURAPPNAME>.desktop
:
[Desktop Entry]
Version=1.0
Name=<YOURAPPNAME>
Comment=<YOURAPPDESCRIPTION>
Exec=~/.local/bin/<YOURAPPNAME>
Terminal=false
Type=Application
Icon=meld
Categories=GNOME;Development;
StartupNotify=false
NoDisplay=false