加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 来自Android.mk的Shell脚本调用,标准输出和缺少的分隔符

发布时间:2020-12-15 19:03:33 所属栏目:安全 来源:网络整理
导读:我有一个简单的Android.mk文件: LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)$(shell ($(LOCAL_PATH)/echo_test.sh))LOCAL_MODULE := libecho_testLOCAL_MODULE_TAGS := optionalinclude $(BUILD_SHARED_LIBRARY) 它有趣的是调用’echo_test.sh’bas
我有一个简单的Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

$(shell ($(LOCAL_PATH)/echo_test.sh))

LOCAL_MODULE := libecho_test
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)

它有趣的是调用’echo_test.sh’bash脚本.在脚本的内容是的情况下

#!/bin/bash
echo 'echo is working' >&2

要么

#!/bin/bash
echo 'echo is working' >/dev/null

一切都好.

bash脚本出现问题

#!/bin/bash
echo 'echo is working'

要么

#!/bin/bash
echo 'echo is working' >&1

然后返回的错误是

Android.mk:4: *** missing separator.  Stop.

Android NDK 7以及在Android Ice Cream Sandwich 4.0.3的构建过程中包含此模块时都会发生这种情况.

我真的无法理解标准输出和Android构建系统的处理方式.有没有人有解释?

Android NDK构建系统实际上是 GNU Make.Android.mk文件中的所有代码都必须是有效的.

当您运行$(shell)并且不将值存储在变量中时,就好像您将脚本的标准输出复制到Android.mk文件中一样.即,就好像你的文件包含以下内容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

echo is working

LOCAL_MODULE := libecho_test
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)

..这是无效的make语法.在脚本中重定向到>& 2是有效的,因为输出转到错误输出,然后显示在控制台上.

正如Vishrut所提到的,使用$(info)或$(警告)来打印消息.或者,如果您确实希望在构建期间运行脚本,请将其输出存储在变量中:

ECHO_RESULT := $(shell ($(LOCAL_PATH)/echo_test.sh))

在这里你不会看到脚本的echo输出,它会进入变量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读