Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

realpath(3), symlinks, '..' components, and the ':A' word modifier



Feedback is sought for a proposed behaviour change to the shell.

Currently, the ':a' word modifier removes '..' component from a path —
using a purely syntactic transformation, i.e., without consulting the
filesystem at all — and ':A' does the same and then resolves symlinks
[so no path component in the result is a symlink].

It has been proposed to change the semantics of :A to resolve symlinks
first and '..' components second, like the realpath(3) library function
does.

Under the incumbent semantics, $foo:A denotes the same file as $foo:a
(but not necessarily the same file as $foo).  Under the proposed
semantics, $foo:A denotes the same file as $foo (but not necesarily the
same file as $foo:a).

Would this change be a good idea?

----- Forwarded message from Daniel Shahaf <d.s@xxxxxxxxxxxxxxxxxx> -----

> Date: Fri, 10 Jun 2016 17:36:23 +0000
> From: Daniel Shahaf <d.s@xxxxxxxxxxxxxxxxxx>
> To: zsh-workers@xxxxxxx
> Subject: [PATCH 2/3] Fix the ':A' word modifier on paths with '..' components.
> Message-ID: <1465580184-3095-2-git-send-email-danielsh@tarsus.local2>
> X-Seq: 38650
> 
> This is an incompatible change; see the test and docs changes for details.
> 
> Daniel
> 
>  Doc/Zsh/expn.yo   |  6 ++++--
>  README            |  9 +++++++++
>  Src/hist.c        | 22 ++++++++++------------
>  Test/D02glob.ztst |  6 ++++++
>  4 files changed, 29 insertions(+), 14 deletions(-)
> 
> diff --git a/Doc/Zsh/expn.yo b/Doc/Zsh/expn.yo
> index c6e7b6f..50b8479 100644
> --- a/Doc/Zsh/expn.yo
> +++ b/Doc/Zsh/expn.yo
> @@ -225,9 +225,11 @@ intervening directories do not exist.
>  )
>  item(tt(A))(
>  As `tt(a)', but also resolve use of symbolic links where possible.
> -Note that resolution of `tt(..)' occurs em(before) resolution of symbolic
> -links.  This call is equivalent to tt(a) unless your system has the
> +This call is equivalent to tt(a) unless your system has the
>  tt(realpath) system call (modern systems do).
> +
> +em(Note): In zsh 5.2 and earlier, resolution of `tt(..)' occurred em(before)
> +resolution of symbolic links.
>  )
>  item(tt(c))(
>  Resolve a command name into an absolute path by searching the command
> diff --git a/README b/README
> index d5343db..84bb6bc 100644
> --- a/README
> +++ b/README
> @@ -79,6 +79,15 @@ Other aspects of EXIT trap handling have not changed --- there is still
>  only one EXIT trap at any point in a programme, so it is not generally
>  useful to combine POSIX and non-POSIX behaviour in the same script.
>  
> +4) On systems that have the realpath(3) library function, the ':A' word
> +modifier now resolves symbolic links before '..' path components.  This
> +could lead to different, but usually more desirable, results: the
> +tranformed value will now always identify the same directory entry as the
> +the pre-transformation value.
> +
> +The behaviour of 5.2 and older can be achieved by chaining modifiers:
> +'<expression>:a:A'.
> +
>  Incompatibilities between 5.0.8 and 5.2
>  ---------------------------------------
>  
> diff --git a/Test/D02glob.ztst b/Test/D02glob.ztst
> index 8618378..dc1a655 100644
> --- a/Test/D02glob.ztst
> +++ b/Test/D02glob.ztst
> @@ -670,3 +670,9 @@
>   () { set -- ${PWD}/$^@; print -l -- $@:A } glob.tmp/nonexistent/foo/bar/baz
>  0:modifier ':A' doesn't require existence
>  *>*/glob.tmp/nonexistent/foo/bar/baz
> +
> + ln -s dir3/subdir glob.tmp/link
> + () { print ${1:A} } glob.tmp/link/../../hello
> + rm glob.tmp/link
> +0:modifier ':A' resolves symlinks before '..' components
> +*>*glob.tmp/hello
> 

----- End forwarded message -----



Messages sorted by: Reverse Date, Date, Thread, Author