> ## Documentation Index
> Fetch the complete documentation index at: https://docs.syntblaze.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Bash Process Substitution Input

The `<(...)` operator, known as **process substitution**, dynamically executes a command and exposes its standard output (stdout) as a temporary file path to an enclosing command. It bridges the gap between commands that strictly require file paths as arguments and commands that generate output to stdout.

```bash theme={"dark"}
outer_command <(inner_command)
```

*Note: There must be no space between the `<` and the `(`. A space would cause Bash to interpret the `<` as a standard input redirection operator.*

## Execution Mechanism

When the Bash parser encounters the `<(...)` construct, it does not pass the literal string or the direct output to the outer command. Instead, it performs the following sequence of system-level operations:

1. **Descriptor Allocation:** Bash creates a named pipe (FIFO) or allocates an anonymous pipe mapped to a file descriptor. On modern POSIX systems, this is typically exposed via the `/dev/fd/` directory (e.g., `/dev/fd/63`).
2. **Asynchronous Execution:** The `inner_command` is spawned in a background subshell.
3. **Stream Redirection:** The stdout of the `inner_command` is connected to the write end of the allocated pipe or file descriptor.
4. **Argument Substitution:** Bash replaces the entire `<(...)` syntax in the original command line with the absolute path to the read end of the pipe.
5. **Cleanup:** Once the file descriptors are closed and the outer command terminates, Bash reaps the background process and destroys the temporary file descriptor or FIFO.

## Visualizing the Substitution

Because Bash replaces the operator with a file path before the outer command executes, passing it to a command like `echo` reveals the underlying file descriptor rather than the output of the inner command:

```bash theme={"dark"}
$ echo <(ls)
/dev/fd/63
```

In this execution context, the outer command receives `/dev/fd/63` as a standard positional argument. It opens this path as a file and reads the stream generated by the inner command.

## Technical Characteristics

* **Concurrency:** The inner process and the outer process run asynchronously. The outer command begins execution immediately, reading from the pipe as the inner command writes to it.
* **Unidirectional Stream:** The `<(...)` variant is strictly for reading output *from* the inner command. It is a read-only stream from the perspective of the outer command.
* **Non-Seekable:** Because the underlying mechanism relies on pipes or FIFOs, the resulting "file" is a continuous stream. The outer command cannot perform seek operations (e.g., `lseek()`, rewinding, or jumping to specific byte offsets) on the provided file path.
* **Scope:** The file descriptor is transient and strictly scoped to the execution lifecycle of the outer command.

<div
  style={{ 
display: "flex", 
justifyContent: "space-between", 
alignItems: "center", 
maxWidth: "754px", 
padding: "1rem 0",
marginBottom: "24px"
}}
>
  <span style={{ fontWeight: "bold", fontSize: "1.25rem", color: "var(--tw-prose-headings)", fontFamily: "Inter, ui-sans-serif, system-ui, sans-serif" }}>Tired of Poor Bash Skills? Fix That With Deep Grasping!</span>

  <a
    href="https://syntblaze.com"
    target="_blank"
    style={{ 
  marginLeft: "24px",
  textDecoration: "none", 
  backgroundColor: "#007AFF",
  color: "#ffffff", 
  padding: "6px 16px", 
  borderRadius: "16px",
  fontSize: "0.9rem",
  fontWeight: "600",
  textAlign: "center",
  transition: "background-color 0.2s ease"
}}
  >
    Learn More
  </a>
</div>

<div style={{ display: "flex", gap: "12px", flexWrap: "wrap" }}>
  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/skill-tracking.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=b9b0305c93bb501c9e767b5c76c88835" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/skill-tracking.png" />

  <img src="https://mintcdn.com/syntblazellc/23tyuOzaWS88qFlc/images/nuggets.png?fit=max&auto=format&n=23tyuOzaWS88qFlc&q=85&s=c86c80197299762989e9b882419b2109" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/nuggets.png" />

  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/bite-sized-exercises.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=a65f9a38c37ff28ab73ed783c53c60e3" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/bite-sized-exercises.png" />
</div>

<div style={{ display: "flex", gap: "12px", flexWrap: "wrap", marginTop: "12px" }}>
  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/mastery-chain.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=748a1763454713e679260fbb95f154a2" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/mastery-chain.png" />

  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/element-previews.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=242f61448ff5dd6deaaab2dccc13b507" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/element-previews.png" />

  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/element-explanations.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=cf0fc1c31f9cd0fc26716781be05fbc9" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/element-explanations.png" />
</div>
