如何使用其他非永久别名启动 ZSH shell 会话?
How to start a ZSH shell session with additional non-permanent aliases?
我在 NixOS I've added rabbitmq-server
in a shell.nix
, and need to pass the paths to its binaries to pytest as command line arguments so the pytest-rabbitmq 上默认使用 ZSH shell 插件可以找到它们。
为此,我希望能够使用包含所需参数的 pytest
别名启动 ZSH:
{ pkgs ? import <nixpkgs> { } }:
(
let rabbitmq_bin = "${builtins.toString pkgs.rabbitmq-server}/bin"; in
pkgs.mkShell {
buildInputs = [
pkgs.python39Packages.pytest
# ... (Python environment details omitted for brevity)
pkgs.rabbitmq-server
];
shellHook = "
alias pytest=\"pytest \
--rabbitmq-server ${rabbitmq_bin}/rabbitmq-server \
--rabbitmq-ctl ${rabbitmq_bin}/rabbitmqctl\"
";
}
)
我可以在 shellHook
中添加一个 zsh
调用,但我一直无法找到一种方法来指示它初始化别名。
我考虑过的解决方案:
- 正在修改 pytest.ini。该文件已存在于我的项目存储库中,
并临时修改它会使 Git 更难工作。
- 正在修改我的主目录中的 ZSH startup files。
pytest
别名也会影响我的所有其他环境。我可以使用不同的别名,但它仍然会保留在我的静态 ZSH 配置污染别名中。
- buildFHSUserEnv。如果 ZSH 不屈服于我的意愿,这就是我实际上要尝试的。
nix-shell
/nix develop
最初是为调试 Nixpkgs stdenv-based 构建的特定用例而设计的,它使用 bash.
如果您想支持不同的 shell,我会 recommend 创建自定义 shell 启动器脚本,您可以 运行 使用 nix run
.这为您提供了所需的所有灵活性。也就是说,假设您可以使用实验性功能。
否则,您可以创建一个脚本来填补 nix run
的空白:运行ning nix-build
和 exec
-ing 其结果,即您的自定义 shell 启动器.
或者,您可以生成一个脚本 source
-d.
# zsh-functions.nix
{ pkgs ? import <nixpkgs> {} }:
let
inherit (pkgs) lib;
in
pkgs.writeText "functions.zsh" ''
PATH=${lib.makeBinPath [pkgs.hello]}:$PATH
hi(){
hello
}
''
zsh% eval "source $(nix-build zsh-functions.nix)"
我在 NixOS I've added rabbitmq-server
in a shell.nix
, and need to pass the paths to its binaries to pytest as command line arguments so the pytest-rabbitmq 上默认使用 ZSH shell 插件可以找到它们。
为此,我希望能够使用包含所需参数的 pytest
别名启动 ZSH:
{ pkgs ? import <nixpkgs> { } }:
(
let rabbitmq_bin = "${builtins.toString pkgs.rabbitmq-server}/bin"; in
pkgs.mkShell {
buildInputs = [
pkgs.python39Packages.pytest
# ... (Python environment details omitted for brevity)
pkgs.rabbitmq-server
];
shellHook = "
alias pytest=\"pytest \
--rabbitmq-server ${rabbitmq_bin}/rabbitmq-server \
--rabbitmq-ctl ${rabbitmq_bin}/rabbitmqctl\"
";
}
)
我可以在 shellHook
中添加一个 zsh
调用,但我一直无法找到一种方法来指示它初始化别名。
我考虑过的解决方案:
- 正在修改 pytest.ini。该文件已存在于我的项目存储库中, 并临时修改它会使 Git 更难工作。
- 正在修改我的主目录中的 ZSH startup files。
pytest
别名也会影响我的所有其他环境。我可以使用不同的别名,但它仍然会保留在我的静态 ZSH 配置污染别名中。 - buildFHSUserEnv。如果 ZSH 不屈服于我的意愿,这就是我实际上要尝试的。
nix-shell
/nix develop
最初是为调试 Nixpkgs stdenv-based 构建的特定用例而设计的,它使用 bash.
如果您想支持不同的 shell,我会 recommend 创建自定义 shell 启动器脚本,您可以 运行 使用 nix run
.这为您提供了所需的所有灵活性。也就是说,假设您可以使用实验性功能。
否则,您可以创建一个脚本来填补 nix run
的空白:运行ning nix-build
和 exec
-ing 其结果,即您的自定义 shell 启动器.
或者,您可以生成一个脚本 source
-d.
# zsh-functions.nix
{ pkgs ? import <nixpkgs> {} }:
let
inherit (pkgs) lib;
in
pkgs.writeText "functions.zsh" ''
PATH=${lib.makeBinPath [pkgs.hello]}:$PATH
hi(){
hello
}
''
zsh% eval "source $(nix-build zsh-functions.nix)"