【问题标题】:WSL -- Command Not FoundWSL——未找到命令
【发布时间】:2021-06-08 20:52:05
【问题描述】:

我在 PowerShell wsl pipenv run python ~/test.py 中运行以下命令并收到以下错误 /bin/bash: pipenv: command not found。如果我启动 WSL/Ubuntu,我可以运行 pipenv run python ~/test.py 并获得成功的输出。在 PowerShell 和 Git Bash 中,我可以运行 pipenv -h 并获得正确的输出。 WSL 在哪里寻找这个命令?

在相关说明中,当我启动 WSL/Ubuntu 并获得成功输出时,我可以运行 python ~/test.pypython3 ./test.py。但在 PowerShell 中,只有 wsl python3 ~/test.py 有效。当我运行wsl python ~/test.py 时,我收到相同的命令未找到错误。我错过了什么?

【问题讨论】:

    标签: python python-3.x powershell ubuntu windows-subsystem-for-linux


    【解决方案1】:

    根据我们的 cmets 交换,问题在于 pipenv 可执行文件所在的目录 - /home/<username>/.local/bin/ - 在以非交互方式调用命令时不存在于 PATH 环境变量中 .

    这表明它是一个扩展PATH初始化文件,在您的情况下似乎是~/.bash_profile;要强制显式调用 bash 来获取此文件,必须传递 -l (--login) 选项。

    您报告以下命令最终对您有用:

    bash -l -c "cd ~ && pipenv run python ~/test.py"
    

    注意:

    • 使用-c 的显式调用是wsl.exe 在您向其传递要执行的命令时在后台执行的操作,尽管没有-l(例如wsl date 变成bash -c date)。

      • -c 的使用使得 shell non-interactive,这意味着 ~/.bashrc 也不是 source;如果你想要后者,请添加-i
    • 没有命令(仅执行wsl.exebash.exe),就会进入一个交互式bash shell,实际上它确实使用-l,因此会自动获取@ 987654348@ (wsl.exe / bash.exe 使用另一种机制来请求登录 shell:参数数组的第一个条目(您可以使用 echo $0 检查)设置为 -bash,初始 -告诉 Bash 启动一个登录 shell)。

    另请参阅:谢谢, Zymotik

    【讨论】:

    • bash -lbash --login 的缩写,请参阅 [invoking bash]。(gnu.org/software/bash/manual/html_node/Invoking-Bash.html) 这将使 shell 的行为就像它已被登录直接调用一样。当 shell 是交互式的时,这相当于使用“exec -l bash”启动登录 shell。当 shell 不交互时,将执行登录 shell 启动文件。请参阅Bash Startup Files,了解有关登录 shell 的特殊行为的说明。 @mklement0 谢谢,我已经删除了我的评论。
    • 谢谢,@Zymotik - 我已将您的链接折叠到答案中,并附有更详细的解释。
    猜你喜欢
    • 2022-08-22
    • 2019-01-03
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2012-10-31
    • 2015-10-14
    相关资源
    最近更新 更多