编写一个Shell脚本,首先进入nixshell,然后进入python虚拟环境

2024-09-28 18:45:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想安排wsl的作业。作业需要在nixshell中运行,然后在nixshell下的python虚拟环境中运行。我试图通过编写一个shell脚本来实现这一点,运行./enter.sh

#!/bin/bash
nix-shell -p python38Full python38Packages.virtualenv;
source .venv/bin/activate

但是,它没有进入

(virt)
[nix-shell:xxx] 

在我运行./enter.sh之后。我需要先运行第一行,然后分别运行第二行。 如果有人知道一种编写shell脚本的方法,可以通过运行一个脚本来完成这两个步骤,这将非常有帮助


Tags: 脚本bashsourcebinvirtualenvvenvshnix
1条回答
网友
1楼 · 发布于 2024-09-28 18:45:54

Shell脚本与终端中的交互式会话略有不同

当您在终端中运行nix-shell时,原始shell进程将创建一个nix-shell进程,并让它读取您的输入,直到nix-shell退出,从而将控制权返回给原始shell

另一方面,在shell脚本中,shell将自己读取所有行,并且不会将shell脚本的处理委托给其他可执行文件,如nix-shell.*

如果要运行nix-shell中的所有COMAMND,可以在文件顶部使用一个特殊的shebang。例如:

#!/usr/bin/env nix-shell
#!nix-shell -p python38Full -p python38Packages.virtualenv
#!nix-shell -i bash
source .venv/bin/activate

# insert commands to be run here

/usr/bin/env只是查找nix-shell的助手,没有绝对路径。 nix-shell作为脚本解释器运行,它将为自己的选项解析#!nix-shell行。 -i bash选项告诉它调用bash作为此脚本的实际解释器。 bash忽略shebang和#!nix-shell行,因为它们是注释nix-shell已经预先设置了正确的环境变量。它将继续源激活文件

您可能希望在运行source之前生成激活脚本,但我认为这取决于您的工作流

或者,您可以使用nix-shell run COMMAND选项在Nix提供的上下文中运行单个命令


*:括号中的命令在单独的进程中运行,但这主要是一个实现细节。它不会让其他程序接管脚本的执行

相关问题 更多 >