<html devsite>
<head>
  <meta name="project_path" value="/_project.yaml">
  <meta name="book_path" value="/versions/7.6.0/_book.yaml">
</head>
<body>

<h1 class="page-title" id="modules.exec_result">exec_result</h1>

{% dynamic setvar source_file "src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkExecutionResult.java" %}
{% dynamic setvar version "7.6.0" %}
{% dynamic setvar original_path "/rules/lib/builtins/exec_result" %}
{% include "_buttons.html" %}
<!-- {% raw %} -->

A structure storing result of repository_ctx.execute() method. It contains the standard output stream content, the standard error stream content and the execution return code.


<h2>Members</h2>
<ul>
    <li>
    <a href="#return_code">return_code</a>
  </li>
      <li>
    <a href="#stderr">stderr</a>
  </li>
      <li>
    <a href="#stdout">stdout</a>
  </li>
  </ul>

      <h2 id="return_code">return_code</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../core/int.html">int</a> exec_result.return_code</pre></p>

    The return code returned after the execution of the program. 256 if the process was terminated by a time out; values larger than 128 indicate termination by a signal.



        <h2 id="stderr">stderr</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../core/string.html">string</a> exec_result.stderr</pre></p>

    The content of the standard error output returned by the execution.


        <h2 id="stdout">stdout</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../core/string.html">string</a> exec_result.stdout</pre></p>

    The content of the standard output returned by the execution.



</body>
</html>

<!-- {% endraw %} -->
