Deutsch   English   Français   Italiano  
<vmtrqk$92b$1@reader2.panix.com>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!panix!.POSTED.spitfire.i.gajendra.net!not-for-mail
From: cross@spitfire.i.gajendra.net (Dan Cross)
Newsgroups: comp.unix.shell
Subject: Re: Default PATH setting - reduce to something more sensible?
Date: Thu, 23 Jan 2025 16:47:16 -0000 (UTC)
Organization: PANIX Public Access Internet and UNIX, NYC
Message-ID: <vmtrqk$92b$1@reader2.panix.com>
References: <vm5dei$2c7to$1@dont-email.me> <20250122120930.74@kylheku.com> <ccr96l-eot.ln1@ID-313840.user.individual.net> <vmthmu$3bb88$1@news.xmission.com>
Injection-Date: Thu, 23 Jan 2025 16:47:16 -0000 (UTC)
Injection-Info: reader2.panix.com; posting-host="spitfire.i.gajendra.net:166.84.136.80";
	logging-data="9291"; mail-complaints-to="abuse@panix.com"
X-Newsreader: trn 4.0-test77 (Sep 1, 2010)
Originator: cross@spitfire.i.gajendra.net (Dan Cross)
Bytes: 4197
Lines: 90

In article <vmthmu$3bb88$1@news.xmission.com>,
Kenny McCormack <gazelle@shell.xmission.com> wrote:
>In article <ccr96l-eot.ln1@ID-313840.user.individual.net>,
>Geoff Clare  <netnews@gclare.org.uk> wrote:
>...
>>Yes.  Perhaps I trimmed too much.  The post I was replying to said
>>"$HOME/bin [..] is better than ~/bin, because tilde expansion is not,
>>AFAIK, included in POSIX" and $HOME is also, of course, expanded before
>>PATH is assigned.  So there is no reason to prefer $HOME/bin over ~/bin
>>since (when used in an assignment) they are equivalent in POSIX.
>
>1) I have no idea what your beef with Kaz is.  It seems silly at best.

The response you're replying to seemed pretty collegial to me;
am I missing something?

>2) I know this isn't going to sit well with you, but there absolutely are
>situations (in bash) where ~ doesn't work as a substitute for $HOME, when
>setting the various "path" variables.  I know that I had lines in .profile
>and/or .bashrc like: PATH=~/bin:$PATH (and similar) that did not work (that
>is, the value stored in the variable contained an explicit tilde rather
>than the expanded value - and this, of course, doesn't work at runtime).
>Replacing the tilde with $HOME fixes this.
>
>Sorry I don't have details, but it is true nonetheless.

I think the issue is that one wants to prevent a literal string
like `~/bin` from showing up in $PATH.  While a given shell
_may_ interpret such $PATH components as being relative to the
user's home directory (`bash` does) others may not (`ksh` does
not, at least not by default).

Further, C library functions like `execlp`, `execvp` and
`execvpe` that refer to $PATH may not handle `~` expansion, and
are not mandated to where defined by e.g. POSIX.  Similarly for
analogous functions in other programming languages.  Given that
programs that make use of those functions inherit $PATH when
invoked from a shell, this can lead to unexpected behavior in a
way that's hard to diagnose ("it works fine when I run this
program from the shell, but my editor can't find it!").

Also, it's not the case that shells always expand `~` when
setting $PATH, even when $HOME would be expanded, as Kenny
points out.  Here's an example:

: term; echo $HOME
/home/cross
: term; pwd
/home/cross
: term; echo echo xyzzy >bin/quux
: term; chmod +x bin/quux
: term; which quux
/home/cross/bin/quux
: term; quux
xyzzy
: term; exec ksh
: term; export PATH=~/bin:/bin:/usr/bin
: term; echo $PATH
/home/cross/bin:/bin:/usr/bin
: term; which quux
/home/cross/bin/quux
: term; quux
xyzzy
: term; export PATH="$HOME/bin:/bin:/usr/bin"
: term; echo $PATH
/home/cross/bin:/bin:/usr/bin
: term; which quux
/home/cross/bin/quux
: term; quux
xyzzy
: term; export PATH="~/bin:/bin:/usr/bin"
: term; echo $PATH
~/bin:/bin:/usr/bin
: term; which quux
: term; quux
ksh: quux: not found
: term; exec /usr/pkg/bin/bash
: term; echo $PATH
~/bin:/bin:/usr/bin
: term; which quux
: term; quux
xyzzy
: term;

I suppose the moral is, for maximal portability, prefer using
$HOME (or another similar variable) to `~` when setting $PATH
unless you're doing so in a context where you are sure that `~`
will be expanded during assignment.

	- Dan C.