bash - 验证 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;
解决方案
你必须使它成为一个巨大的、单一的 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
推荐阅读
- javascript - MongoParseError:无效的连接字符串
- php - 从路由 Laravel 将参数 {id} 粘贴到控制器中
- ruby-on-rails - 如何找到两个物体之间的距离?
- xml - 如何使用 PowerShell 创建 XML 根/序言注释?
- angular - 如何使用 API 从服务器获取图像并推入数组
- bootstrap-4 - Bootstrap 4折叠的内容没有隐藏
- javascript - 如何对我的点击功能进行条件显示和隐藏模式
- python - 我每次都需要在 python 虚拟环境中安装包吗?
- vue.js - 我应该独立版本 Vue.js 单文件组件吗?
- php - 有没有办法让我的 PHP 输出以表格的形式出现?(它必须在一个while嵌套循环中)