bazel - Genrule 不会在最终输出文件中输出“$@”符号
问题描述
我正在写一个如下的类:
genrule(
name = "create_run_script",
outs = ["run_script.sh"],
executable = True,
cmd = """
cat > $@ << EOF
#!/bin/bash
cd ../dir/
exec ./program "$$@"
EOF
""",
)
当我执行此操作时,我看到了输出
# @external_repo//:create_run_script [action 'Executing genrule @ external_repo//:create_run_script']
(cd /home/marc/.cache/bazel/_bazel_marc/0877f3fef7c185b84693d3a53e00a8be/execroot/zoox && \
exec env - \
FLAGS_minloglevel=1 \
LD_LIBRARY_PATH='' \
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
/bin/bash -c 'source external/bazel_tools/tools/genrule/genrule-setup.sh;
cat > bazel-out/k8-fastbuild/bin/external/external_repo/run_script.sh << EOF
#!/bin/bash
cd ../external_repo/
exec ./program "$@"
EOF
')
但是,当我打开实际的 shell 脚本文件时,我看到
#!/bin/bash
cd ../external_repo/
exec ./program ""
EOF
$@ 符号不再存在!如何使用 Bazel genrule 指令创建一个可以接收来自 shell 的输入的 shell 脚本?
解决方案
创建该脚本的 shell 调用正在扩展$@
;heredoc 需要禁用扩展:
genrule(
name = "create_run_script",
outs = ["run_script.sh"],
executable = True,
cmd = """
cat > $@ << 'EOF'
#!/bin/bash
cd ../dir/
exec ./program "$$@"
EOF
""",
)
(注意周围的引号'EOF'
。)
推荐阅读
- firebase - Flutter:可以在单独的隔离工作中初始化 Firebase 动态链接、远程配置、身份验证和深层链接吗?
- python - 如何在 Keras 中创建线性组合层?
- react-native - 如何在反应原生火基础应用程序中更改最喜欢的切换图标颜色?
- c++ - 一个警告和 main() 返回垃圾值
- javascript - 当我使用外部源将图像添加到我的博客时,它永远不会显示为缩略图
- git - 提交后如何撤消 git rm
- android - 如何从片段中的活动从 BroadcastReceiver 获取数据?
- reactjs - 表格内需要 Antd 单选按钮
- computer-vision - 如何连接厨房和客厅python OpenCV之间的单断开线
- android - 在 android studio 中模拟或实时测试时看不到文本框