Re: [PATCH] exec: Print absolute paths for command location queries
"Kerin Millar" <[email protected]> Sat, 06 Jun 2026 18:48:19 +0100
| Newsgroups | org.kernel.vger.dash |
|---|---|
| Message-ID | <[email protected]> |
Hi Harald, On Sat, 6 Jun 2026, at 6:27 PM, Harald van Dijk wrote: > On 06/06/2026 16:36, Kerin Millar wrote: >> POSIX requires that, when reporting the location of a utility found by >> searching PATH (or one named with a slash), the pathname written by >> type, command -v and command -V be absolute: >> >> Executable utilities, regular built-in utilities, command_names >> including a <slash> character, and any implementation-provided >> functions that are found using the PATH variable [...] shall be >> written as absolute pathnames. >> >> Presently, dash fails to conform in this regard. Address this issue by >> incorporating a helper function that prefixes relative pathnames with >> the shell's cached current working directory. > > Hi, > > Although this ensures that the written path is absolute whenever > possible, it does not ensure that the written path corresponds to the > command that would be executed. Although curdir cannot be altered by the > user, that does not mean it should be trusted for this purpose, because > the file system may have changed after the current directory was set. > > Consider: > > cd /tmp > mkdir a > cd a > ln -s /bin/ls > PATH=. command -v ls # should print /tmp/a/ls or /tmp/a/./ls > mv /tmp/a /tmp/b > PATH=. command -v ls # must not print /tmp/a/ls or /tmp/a/./ls > > Printing /tmp/a/ls for that last line is worse than printing ./ls: ./ls > may not be absolute but at least resolves to the command that would be > executed. > > bash does not appear to consider this requirement useful, so in > non-POSIX mode just prints ./ls. In POSIX mode it prints /tmp/a/./ls twice. > > ksh prints /tmp/a/ls twice, regardless of POSIX mode. > > zsh prints ./ls twice, regardless of sh mode. > > yash correctly prints /tmp/a/./ls, followed by /tmp/b/./ls. > > My shell, gwsh, also prints /tmp/a/./ls, followed by /tmp/b/./ls. > > I think leaving it as printing a correct relative path is better than > printing a possibly wrong absolute path, personally. A change to print a > correct absolute path would have my support though, for whatever that is > worth. It's a good point. How about using getcwd() and printing the relative path upon failure, even if to do so would not be strictly conforming? -- Kerin Millar