This command uses process substitution (<(command)) to pass the output of curl as a file-like input to bash. Let’s break it down:
What’s Happening?
bash <(curl -sL https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)
curl -sL <URL>- Fetches the script (
install-release.sh) from the given URL. -s= Silent mode (no progress/errors shown).-L= Follow redirects (if any).
- Fetches the script (
- Process Substitution (
<(...))<(command)creates a temporary named pipe (FIFO) or /dev/fd file descriptor containing the output ofcurl.- Instead of saving the script to disk, Bash treats the output as a temporary “file” for input.
bash <file>- The script is executed directly by
bashwithout being saved to disk.
- The script is executed directly by
Why Use Process Substitution?
- No Temporary File Needed
Avoids writing the script to disk (cleaner, no cleanup required). - Security Consideration
Prevents tampering (if the script were saved, malware could modify it before execution). - One-Liner Convenience
Combines download + execution in a single command.
Alternatives (Without Process Substitution)
# Download to a file, then run (less secure)
curl -sL https://.../install-release.sh -o install.sh
bash install.sh
rm install.sh # Cleanup
# Pipe directly (no process substitution)
curl -sL https://.../install-release.sh | bash
- Piping (
| bash) works but may miss script features (e.g.,$0detection fails). - Process substitution preserves script behavior as if it were a local file.
Key Takeaway
Process substitution (<()) is used here to treat the downloaded script as a file without saving it, combining safety and convenience. It’s a common pattern for remote script execution.