fish 2.6 clarifies terminal input and job lifetime
fish 2.6 brings terminal-aware substitutions and disown into a stable release. New read options distinguish hidden input, literal prompts and bounded input consumption.
A command can read a value from the terminal, return a value to the shell and continue running after a session ends. Those are separate relationships, and fish 2.6 gives each a clearer interface. Command substitutions can access the terminal, read gains silent input and literal prompts, and disown removes jobs from fish's management.
The June 3 stable-release notes carry these changes forward from the May beta. The final release adds minor fixes and documentation improvements. For users upgrading from 2.5, the substantive changes are described in the included beta notes rather than repeated as entirely new stable-release inventions.
I value fish for an interactive experience that needs little custom setup. That preference extends to scripting helpers used at the prompt. Asking for a value should have a direct interface without confusing what appears on screen with how the value is stored or passed onward.
Silent input changes display behavior
The read reference for 2.6 adds --silent, with short form -i. It obfuscates typed characters for input such as passwords. fish cannot reuse Bash's -s spelling because that option already means --shell.
This is a useful example of why visually similar shells still need version-specific command examples. Copying a short flag from another shell can select an unrelated mode. In fish, read --shell enables syntax highlighting and completion suitable for entering shell code.
The long spelling makes the intention explicit. A prompt can request hidden input without relying on the reader to remember which short option the shell assigned to that behavior.
read --local --silent --prompt-str 'Password: ' password
This example assigns the input to a local variable and uses a literal prompt string. It does not print the resulting value or pass it to another command. The example concerns the input interface, not a complete authentication workflow.
Obfuscating terminal display does not describe encryption or secret storage. The value still becomes a shell variable. The reference separately provides export controls, with unexported variables as the default, so display behavior and propagation to child processes should remain distinct concepts.
A literal prompt does not need command syntax
The new --prompt-str option accepts a string for the input prompt. Previously, --prompt expected a shell command whose output became the prompt. A fixed phrase does not need the expressive power of a command.
The reference says the string form escapes special characters before passing the text to echo. This lets the caller express prompt content directly instead of constructing a command around that content. A dynamic prompt can still use the command-based form when it actually needs evaluation.
The distinction makes a helper function easier to read. A reviewer can see whether a prompt is fixed text or a program that produces text. That is particularly useful in an input function where the main purpose is obtaining a value, not executing prompt logic.
Variable scope is also explicit in the example. --local states where the assigned variable belongs. Silent display, prompt generation and variable scope are independent options because changing one does not determine the others.
Input consumption now has a default bound
The release notes give read a default limit of 10 MiB. If input exceeds the limit, fish leaves the target variable empty and reports status 122. The FISH_READ_BYTE_LIMIT variable can change the limit.
This is a protection against malformed input consuming an unreasonable amount of shell memory. It matters for scripts that read streams as well as interactive helpers. A missing delimiter should not imply unlimited accumulation inside the shell.
The documented failure result also distinguishes oversize input from end of file. The reference assigns status one when end of file arrives before the separator, while an ordinary completed read reports zero. Callers can use status to determine whether they received the expected complete input.
By default, read consumes a newline-terminated line. Its NUL mode uses a different separator and disables interactive mode. Changing the separator alters the input record boundary, while the maximum-consumption setting bounds how much data fish accepts for that record.
I prefer explicit input limits with an identifiable failure status. A helper can handle a malformed record without pretending that an empty variable necessarily represents a valid empty response.
Command substitutions can include interactive tools
The release also lets command substitutions access the terminal. Its notes specifically identify fzf as an example enabled by the change. A tool can interact with the user while producing output that the shell captures for another expression.
This separates the selection interface from the selected value. Captured output need not imply that a command has no interactive work to perform. The terminal supplies the interaction while the command's result participates in the surrounding shell operation.
The capability does not require ordinary substitutions to ask questions. It removes a restriction for programs that need terminal access. A noninteractive command can continue to emit a value without using that additional capability.
Job ownership becomes explicit after launch
The disown documentation describes removing a job from fish's job list while leaving the process in existence. Tracked jobs normally receive a hang-up signal when fish terminates. Removing the tracking changes that relationship.
With no argument, disown selects the most recently used job. Explicit process IDs identify other jobs. A stopped job receives a continuation signal with a warning, because fish's bg command cannot resume a job after it has been disowned.
This is a particular job-control operation, not a replacement for managing every runtime dependency of a long-lived service. The process can still depend on files or a terminal established earlier. The command changes fish's ownership of the job, not every external resource the process may use.
The stable release combines these interfaces with performance work in process launching and color-heavy prompt functions. Its notes provide no universal speedup figure. The concrete behavioral changes are sufficient to explain the release's value. Input functions can state how they prompt and consume data, substitutions can accommodate interactive programs, and jobs can leave fish's management through an explicit builtin.