首页 > 解决方案 > 验证 Makefile 中的文件是否存在以执行脚本

问题描述

我在验证此脚本中的文件存在时遇到问题。当 ADDITION 或 DELETIONS 路径中没有文件时,脚本将失败。

如何验证添加或删除路径中有文件?

我正在使用 bash 和 Makefile 做我的第一步,所以任何帮助都将不胜感激。

execute-s3-sync: $(foreach BUCKET,$(S3_BUCKETS),execute-$(BUCKET)-s3-sync) execute-large-files-s3-sync
execute-%-s3-sync: require-target-environment property-SOURCE_DATA_EXPORT_KEY property-TARGET_DATA_EXPORT_KEY
    export AWS_DEFAULT_REGION=$(TARGET_AWS_REGION)
    MANIFEST="$(if $(filter $*,large-files),large-files,$(call get-source-s3-bucket,$*)).gz"
    ADDITION="target/migrations/$(TARGET_DATA_EXPORT_KEY)/diff/$(SOURCE_DATA_EXPORT_KEY)/additions/$$MANIFEST"
    DELETION="target/migrations/$(TARGET_DATA_EXPORT_KEY)/diff/$(SOURCE_DATA_EXPORT_KEY)/deletions/$$MANIFEST"
    [[ -f "$$ADDITION" ]] && \
    pipenv run python scripts/large-files-copy.py \
        $(foreach BUCKET,$(S3_BUCKETS),--bucket-equivalences $(call get-source-s3-bucket,$(BUCKET)) $(call get-target-s3-bucket,$*)) \
        --manifest $$ADDITION \
        submit-to-batch \
            --job-queue "$(STACK_PREFIX)-batch-job-queue" \
            --job-definition "$(STACK_PREFIX)-batch-job-definition"
    [[ -f "$$DELETION" ]] && \
    pipenv run python scripts/large-files-copy.py \
        $(foreach BUCKET,$(S3_BUCKETS),--bucket-equivalences $(call get-source-s3-bucket,$(BUCKET)) $(call get-target-s3-bucket,$*)) \
        --manifest $$DELETION \
        local-run \
            --operation remove;

标签: bashmakefile

解决方案


你必须使它成为一个巨大的、单一的 bash 命令;make 在 shell 中分别执行每一行,变量在后面的步骤中不可用。为了提高可读性/可维护性,我将test -f ... && xxx这里的语句替换为if块。

例如

execute-%-s3-sync: ...
    MANIFEST="$(if $(filter $*,large-files),large-files,$(call get-source-s3-bucket,$*)).gz" && \
    ADDITION="target/migrations/$(TARGET_DATA_EXPORT_KEY)/diff/$(SOURCE_DATA_EXPORT_KEY)/additions/$$MANIFEST" && \
    DELETION="target/migrations/$(TARGET_DATA_EXPORT_KEY)/diff/$(SOURCE_DATA_EXPORT_KEY)/deletions/$$MANIFEST" && \
    if test -f "$$ADDITION"; then \
       ...
    fi && \
    if test -f "$$DELETION"; then \
       ...

关于失败,你必须以积极的方式表达事情。例如

  • 坏的:

    test -f $FILE && do_something    ## --> will fail when $FILE does not exists
    
  • 好的:

    ! test -f $FILE || do_something  ## --> fails only, when do_something fails
    
  • 好的:

    if test -f $FILE; then
       do_something
    fi
    

推荐阅读