【问题标题】:Why does this shell script fail, if it works when I enter each line into a terminal?如果在我将每一行输入终端时它有效,为什么这个 shell 脚本会失败?
【发布时间】:2026-02-03 06:05:01
【问题描述】:

我制作了一个简短的 shell 脚本,如下所示:

#!/bin/sh

PROJECT_NAME="my_project"

mkdir $PROJECT_NAME
cd $PROJECT_NAME
python3 -m venv beeware-venv
source beeware-venv/bin/activate
python3 -m pip install briefcase
briefcase new

当我使用sh create_new_beeware_project 运行此脚本时,失败的第一行是source beeware-venv/bin/activate;我得到的错误是“来源:未找到”。但是,如果我将每一行一一输入终端,一切正常

这本身并不是什么大问题;最终,我可以手动输入命令。但是这让我觉得 shell 脚本有一些我不理解的重要内容,如果可能的话,我想向我解释一下。

【问题讨论】:

  • 尝试添加 ./beeware-venv/bin/activate
  • 如何运行脚本?这可能很重要,因为有一个错字(它应该以#! 开头,你已经交换了这些字符)。
  • source ./beeware-venv/bin/activate ,假设您正在从具有 beeware-venv 的终端路径运行脚本
  • 可以尝试打印 pwd 和 ls 看看 shell 脚本当前目录是什么?
  • 当你这样做时你能在列表中看到beeware-venv

标签: python terminal sh virtual-environment beeware


【解决方案1】:

涉及到两个 shell:您的交互式 shell,很可能是 bash,和 /bin/sh,您系统的默认 POSIX shell。 source 是您的 /bin/sh 无法识别的 . 的非标准别名。请改用.

#!/bin/sh

PROJECT_NAME="my_project"

mkdir "$PROJECT_NAME" || exit 1
cd "$PROJECT_NAME"
python3 -m venv beeware-venv
. beeware-venv/bin/activate
python3 -m pip install briefcase
briefcase new

【讨论】:

  • 谢谢。至少这不是对 shell 脚本本质的根本误解!
最近更新 更多