~ $ p=~:~:~ ; declare -p p
declare --
p="/data/data/com.termux/files/home:/data/data/com.termux/files/home:/data/data/com.termux/files/home"

~ $ cp $( type -P bash ) sh
~ $ ./sh
sh-5.2$ x=~:~:~:
sh-5.2$ declare -p x
declare --
x="/data/data/com.termux/files/home:/data/data/com.termux/files/home:/data/data/com.termux/files/home:"

sh-5.2$ set -o posix
sh-5.2$ f=~:~:~
sh-5.2$ declare -p f
declare --
f="/data/data/com.termux/files/home:/data/data/com.termux/files/home:/data/data/com.termux/files/home"

im under the impression
by ur code examples
.. in quotes , ~ doesnt expand

greets

On Tue, Feb 4, 2025, 2:04 AM Zeffie via Bug reports for the GNU Bourne
Again SHell <bug-bash@gnu.org> wrote:

> To whom it may concern,
>
> Bash has long maintained a legacy feature whereby, in interactive
> sessions, a literal tilde (`~`) at the start of a `PATH` element (e.g.,
> `~/bin`) is expanded to the user’s home directory at the time a command
> is executed. While this behavior can sometimes “help” users find
> commands in their home directory, it is neither consistent with POSIX
> nor universally understood. In particular, when Bash is invoked as
> `/bin/sh` or in POSIX mode, tilde expansion in `PATH` is disabled,
> leading to potential confusion and hard-to-debug issues.
>
> Given that a number of legacy systems and scripts may depend on this
> behavior—and that it can easily be mistaken for a more portable
> feature—the behavior should be formally documented. Furthermore,
> preserving it (while discouraging its use in new code) spares users from
> having to build custom versions of Bash for environments that rely on
> this quirk.
>
> Why Document This Behavior?
>
> Clarity and Portability:
>     Many users naturally assume that writing
>     ```bash
>     export PATH="~/bin:$PATH"
>     ```
>     is equivalent to
>     ```bash
>     export PATH="$HOME/bin:$PATH"
>     ```
>     in all contexts. However, because Bash in interactive mode expands
> the tilde at command execution time while POSIX mode (or `/bin/sh`
> invocations) does not, scripts may work as expected in one context and
> fail in another. Documenting this inconsistency would alert developers
> to the subtle differences, promoting best practices in portable
> scripting.
>
> Preventing Inadvertent Errors:
>     As legacy systems evolve and environments become more heterogeneous,
> the likelihood of encountering the non-expanded tilde in non-interactive
> contexts increases. Clear documentation would help prevent unexpected
> command-not-found errors when scripts (or applications invoking
> `system(3)`) rely on the interactive shell’s behavior.
>
> Historical Consistency and Backward Compatibility:
>     The behavior has been part of Bash since its early days. Removing or
> modifying it without proper notice would break existing scripts that,
> knowingly or not, depend on tilde expansion in the `PATH`. By
> documenting the behavior—and marking it as legacy—we provide a clear
> notice that while this feature is maintained for backward compatibility,
> its use in new scripts is discouraged.
>
> Supporting Legacy Systems:
>     Numerous systems in the field, including embedded devices and
> enterprise environments, might still be running scripts that use this
> behavior. Maintaining and documenting it means that system
> administrators and developers do not have to invest in building or
> patching custom Bash versions to preserve compatibility.
>
> Proposed Additions to the Bash Reference Manual
>
> To address the above points, the following text (or similar language) is
> proposed for inclusion in the Bash Reference Manual:
>
> Tilde Expansion in the `PATH` Variable
>
> Description:
> In interactive Bash sessions, any element of the `PATH` variable that
> begins with a tilde (e.g., `~` or `~/bin`) is automatically expanded to
> the corresponding home directory of the current user at the time a
> command is executed. For example, if the user's home directory is
> `/home/alice`, then an entry `~/bin` in the `PATH` is interpreted as
> `/home/alice/bin` during command lookup.
>
> Behavior Details:
>
> Interactive Bash:
>    When Bash is invoked in its default interactive mode, the tilde
> expansion is performed as if the entry were unquoted. This expansion
> occurs at the time of command execution and allows commands located in
> the user’s home directory (e.g., in `/home/alice/bin`) to be found even
> if the `PATH` contains a literal tilde.
>
> Bash in POSIX Mode or as `/bin/sh`:
>    When Bash is invoked as `/bin/sh` or with POSIX mode enabled (see
> [Bash POSIX
> Mode](
> https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html)),
>
> tilde expansion in `PATH` is not performed. In these contexts, a literal
> tilde remains unexpanded, and any command lookup that relies on such
> expansion will fail.
>
> Recommendations for Script Authors:
>
> For portable scripts and applications, it is recommended to explicitly
> use the `$HOME` variable when specifying paths:
>
>    ```bash
>    export PATH="$HOME/bin:$PATH"
>    ```
>
>    This practice ensures consistent behavior regardless of the shell’s
> mode of operation.
>
> Legacy Support Notice:
>
> This tilde expansion behavior in `PATH` is maintained for backward
> compatibility with legacy systems. Although its reliance in new scripts
> is discouraged, it remains documented and supported to avoid forcing
> users of older systems to build custom versions of Bash. Future releases
> may mark this feature as obsolescent, and users are encouraged to
> transition to explicit variable expansions to meet modern portability
> standards.
>
> Supporting the Case for Preservation
>
> Technical and Standards Considerations
>
> POSIX Standards:
>    The IEEE Std 1003.1-2017 (commonly known as POSIX.1-2017) does not
> mandate tilde expansion for `PATH` elements. Bash’s behavior in POSIX
> mode is therefore in line with the standard. However, the interactive
> expansion is a historical extension that, while noncompliant with POSIX,
> remains useful in certain contexts.
>
> Backward Compatibility:
>    Many existing scripts in use across various environments—especially
> those that originated before the widespread adoption of POSIX-compliant
> shells—depend on the interactive expansion of `~` in `PATH`. Maintaining
> this behavior while clearly documenting it allows both legacy systems
> and new projects to coexist without forcing unnecessary modifications.
>
> Practical Benefits
>
> Avoiding Custom Builds:
>    Users and system administrators working in environments with legacy
> systems often prefer to use the system-provided Bash version. By
> documenting and preserving this behavior, there is no need for custom
> compilations or patches solely to retain expected functionality.
>
> Ease of Migration:
>    Clear documentation enables developers to quickly understand the
> potential pitfalls when migrating scripts between different shell
> invocation modes. With explicit warnings and recommendations, developers
> can plan refactoring efforts to replace `~` with `$HOME` where
> portability is required.
>
> In closing
>
> Documenting the tilde expansion behavior in `PATH` is critical for both
> clarity and long-term compatibility. It ensures that users and
> developers are aware of the discrepancy between interactive and POSIX
> modes, thereby preventing subtle bugs and easing maintenance burdens.
> Moreover, preserving this legacy functionality—while clearly warning
> against its use in new code—strikes a balance between honoring
> historical behavior and promoting best practices in modern scripting.
>
> By including a dedicated section in the Bash Reference Manual that
> explains this behavior and its limitations, the maintainers of Bash can
> offer better guidance to users. This change would support legacy systems
> in continued operation while encouraging the use of portable, explicit
> path expansions in new developments.
>
> References:
>
> Bash POSIX Mode Documentation:
>    [Bash POSIX
> Mode](
> https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html)
>
> IEEE Std 1003.1-2017 (POSIX.1-2017):
>    This standard outlines the behavior expected of POSIX-compliant
> shells, which does not include tilde expansion in `PATH` elements.
>
> Historical Discussions on comp.unix.shell:
>    Various discussions have highlighted the confusion arising from this
> undocumented behavior, reinforcing the need for clear documentation in
> the official manual.
>
> This proposal aims to foster a better understanding of Bash’s behavior
> among both legacy users and modern script writers, ensuring that the
> benefits of backward compatibility do not come at the cost of clarity
> and portability.
>
>

Reply via email to