为什么这个 shell 脚本会失败,如果它在我将每一行输入到终端时有效?
Why does this shell script fail, if it works when I enter each line into a terminal?
我制作了一个简短的 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
;我得到的错误是 'source: not found'。但是,如果我将每一行逐行输入终端,一切正常。
这本身并不是什么大问题;最终,我只能手动输入命令。但是 这让我觉得 shell 脚本中有一些我不理解的重要内容,如果可能的话,我希望有人向我解释一下。
涉及两个 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 脚本,它是这样的:
#!/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
;我得到的错误是 'source: not found'。但是,如果我将每一行逐行输入终端,一切正常。
这本身并不是什么大问题;最终,我只能手动输入命令。但是 这让我觉得 shell 脚本中有一些我不理解的重要内容,如果可能的话,我希望有人向我解释一下。
涉及两个 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