编写一个Shell脚本首先进入nixshell,然后进入python虚拟环境
Writing One Shell script to first enter nix shell, then enter the python virtual environment
我想从 wsl 安排工作。该作业需要在 nix-shell 中 运行,然后在 Nix-shell 下的 python 虚拟环境中。我尝试通过编写 shell 脚本来做到这一点,运行 ./enter.sh
.
#!/bin/bash
nix-shell -p python38Full python38Packages.virtualenv;
source .venv/bin/activate
然而,它并没有进入
(virt)
[nix-shell:xxx]
在我运行./enter.sh
之后。我需要先 运行 第一行,然后分别 运行 第二行。
如果有人知道一种编写 shell 脚本的方法,该脚本可以通过 运行 一个脚本完成这两个步骤,那将非常有帮助。
Shell 脚本与终端中的交互式会话有点不同。
当您在终端中 运行 nix-shell
时,原始 shell 进程会创建一个 nix-shell
进程并让它读取您的输入,直到 nix-shell
退出, 将控制权返回到原来的 shell.
另一方面,在 shell 脚本中,shell 将自己读取所有行,不会将 shell 脚本的处理委托给其他可执行文件,如 nix-shell
。 *
如果您想 运行 nix-shell
中的所有命令,您可以在文件顶部使用一个特殊的 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 提供的上下文中使用 nix-shell
的 --run COMMAND
选项来 运行 单个命令。
*:括号中的命令在单独的进程中执行 运行,但这主要是一个实现细节。它不会让其他程序接管脚本的执行。
我想从 wsl 安排工作。该作业需要在 nix-shell 中 运行,然后在 Nix-shell 下的 python 虚拟环境中。我尝试通过编写 shell 脚本来做到这一点,运行 ./enter.sh
.
#!/bin/bash
nix-shell -p python38Full python38Packages.virtualenv;
source .venv/bin/activate
然而,它并没有进入
(virt)
[nix-shell:xxx]
在我运行./enter.sh
之后。我需要先 运行 第一行,然后分别 运行 第二行。
如果有人知道一种编写 shell 脚本的方法,该脚本可以通过 运行 一个脚本完成这两个步骤,那将非常有帮助。
Shell 脚本与终端中的交互式会话有点不同。
当您在终端中 运行 nix-shell
时,原始 shell 进程会创建一个 nix-shell
进程并让它读取您的输入,直到 nix-shell
退出, 将控制权返回到原来的 shell.
另一方面,在 shell 脚本中,shell 将自己读取所有行,不会将 shell 脚本的处理委托给其他可执行文件,如 nix-shell
。 *
如果您想 运行 nix-shell
中的所有命令,您可以在文件顶部使用一个特殊的 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 提供的上下文中使用 nix-shell
的 --run COMMAND
选项来 运行 单个命令。
*:括号中的命令在单独的进程中执行 运行,但这主要是一个实现细节。它不会让其他程序接管脚本的执行。