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
')
Однако когда я открываю фактический файл сценария оболочки, я вижу
#!/bin/bash
cd ../external_repo/
exec ./program ""
EOF
Символа $@ больше нет! Как мне создать сценарий оболочки, который может принимать входные данные от оболочки с помощью директивы Bazel genrule?
1 ответ
Решение
Вызов оболочки, который создает этот сценарий, расширяется $@
; heredoc необходимо отключить расширение:
genrule(
name = "create_run_script",
outs = ["run_script.sh"],
executable = True,
cmd = """
cat > $@ << 'EOF'
#!/bin/bash
cd ../dir/
exec ./program "$$@"
EOF
""",
)
(Обратите внимание на цитаты вокруг 'EOF'
.)