【问题标题】:Run custom function before $@在 $@ 之前运行自定义函数
【发布时间】: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 提供足够的详细信息以使其明确定义,这可能会变成一个有趣的问题。不要让我们猜测;向我们展示实际代码。

标签: bash shell


猜你喜欢
  • 2022-01-26
  • 2021-06-14
  • 1970-01-01
  • 2016-10-18
  • 2019-12-16
  • 1970-01-01
  • 2011-12-10
  • 2013-05-19
  • 2020-02-25
相关资源
最近更新 更多