【发布时间】:2022-06-11 03:07:53
【问题描述】:
在project.sh 文件中,我有一组函数,我通过运行脚本并获取下一个参数来执行这些函数(例如./project.sh functionName。)
然后我在usr/local/bin 中创建了指向该文件的链接并使其可执行,这样我就可以在任何地方运行它包含的函数。所以在这一切完成之后,我可以运行project functionName 并像这样运行函数。
我想在请求的功能之前执行一些控制。
这是我尝试过的:
-> project.sh
#!/bin/bash
# Enables a sort of strict mode for running the script
# shellcheck disable=SC2039
set -euo pipefail
# Get script DIR
# shellcheck disable=SC2039
SOURCE="${BASH_SOURCE[0]:-$0}";
while [ -L "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname -- "$SOURCE"; )" &> /dev/null && pwd 2> /dev/null; )";
SOURCE="$( readlink -- "$SOURCE"; )";
[[ $SOURCE != /* ]] && SOURCE="${DIR}/${SOURCE}"; # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
PROJECT_SCRIPT="$( cd -P "$( dirname -- "$SOURCE"; )" &> /dev/null && pwd 2> /dev/null; )";
# shellcheck disable=SC2039
source "$PROJECT_SCRIPT/.variables";
# shellcheck disable=SC2039
source "$PROJECT_SCRIPT/docker.sh";
# ---------------------------------------------------------------------
# Check if environment is set
# ---------------------------------------------------------------------
checkEnvironment() {
[[ -z "$ENV" ]] && echo "No ENV found!"
}
help() {
echo -e "Show Help!";
}
# ---------------------------------------------------------------------
# Run the Project
# ---------------------------------------------------------------------
"checkEnvironment"; \
"${@:-help}"
-> /.variables
#!/bin/sh
# Path
PROJECT_ENV="$(dirname -- "$PROJECT_SCRIPT")";
PROJECT_DOCKER="$(dirname -- "$PROJECT_SCRIPT")";
# environment variables
set -o allexport
# shellcheck disable=SC2039
source "$PROJECT_ENV/.env";
set +o allexport
-> docker.sh
#!/bin/sh
# shellcheck disable=SC2039
source "${PROJECT_SCRIPT}/.variables";
# ---------------------------------------------------------------------
# Docker Compose Configuration
# ---------------------------------------------------------------------
dockerCompose="docker-compose -p $PROJECT -f $PROJECT_DOCKER/docker-compose.yml -f $PROJECT_DOCKER/docker-compose.$ENV.yml --env-file $PROJECT_ENV/.env"
# ---------------------------------------------------------------------
# Start Docker Compose
# ---------------------------------------------------------------------
start () {
echo "Starting services..."
if [ "$#" -eq "0" ]
then
$dockerCompose start
else
$dockerCompose start "$@"
fi
}
我想做的是检查变量 ENV 是否已在 .env 文件中设置,该文件旨在添加一个额外的 docker-compose 文件。我希望每次执行任何现有功能时都进行此检查。
当我尝试执行 project start 时,它给了我一个错误,该错误未在控制台中报告给我,并且它不执行任何操作,既不执行 checkEnvironment 也不执行启动。
我该如何解决?
######################### UPD
我找到了错误的原因:在 checkEnvironment 方法中,我放了一个简短的 if 语句,以防万一变量 ENV 被实际设置。
我更新了这个:
checkEnvironment () {
[[-z "$ENV"]] && messageError "${MESSAGE_ENV_EMPTY}" || return 0;
}
现在它可以正常工作了!
【问题讨论】:
-
执行可能的命令之一:这是什么意思?你在说什么可能的命令? _给我一个未报告的错误_:什么是未报告的错误?顺便说一句,您的代码很奇怪:您正在将参数传递给您的函数,但该函数没有获取任何参数。
-
在请求命令之前执行一些控制功能:什么是请求的命令(相对于未请求的命令),它的含义是什么在命令之前执行功能?
-
如果我解释得不好,我深表歉意。在同一个脚本文件中,我还有其他执行其他操作的命令,例如
doSomething () { #do sometihing }。我想,当我在实际执行 doSomething 之前运行./script.sh doSomething时,它会自动运行 checkSomething。 -
@LucaPattocchio 我总是建议通过shellcheck.net 运行脚本并修复它指出的问题——它可能会或可能不会解决这个特定问题,但以后可能会出现安全问题。如果这不能解决它,我认为如果您提供问题的minimal, reproducible Example 会很有帮助 - 您正在尝试的简化版本足够完整,其他人可以对其进行测试并看到您的问题'正在碰到。
-
如果您仍然可以edit 提供足够的详细信息以使其明确定义,这可能会变成一个有趣的问题。不要让我们猜测;向我们展示实际代码。