Nicholas Marriott <[email protected]> wrote:
> I'm not really convinced by all the PWD talk, the canonical way to find
> the current working directory is to call getcwd(). Not to use PWD, that
> is just a shell convenience. I don't think applications should ever need
> to check PWD rather than calling getcwd(). They might not even be run
> from a shell.
>
> AFAICT getcwd() does not collapse symlinks, so I'm not sure what your
> issue is... I can't actually reproduce your original problem. If I do:
For a while I thought that OpenBSD would handle directories and
symlinks differently from Linux but I installed OpenBSD and it is the
same.
It seems the pwd binary (/bin/pwd) does not consider $PWD. But all
the shells have it as a built-in and use it:
$ cd /tmp
$ mkdir a
$ ln -s a b; ln -s a c
$ cd b
$ /bin/pwd
/tmp/a
$ sh -c pwd
$ env PWD= sh -c pwd
/tmp/a
$ env PWD=/tmp/c sh -c pwd
/tmp/c
The kernel does not store (or tell you) how you got to your current
directory, i.e. which symlinks were used. That's what $PWD is for.
It's a convenience variable for shell users hiding the symlinks.
> $ pkill tmux
> $ tmux new
> <inside tmux>
> $ pwd
> /tmp/b
> $ pwd -P
> /tmp/a
>
> Am I doing something incorrect here?
Yes, you have to start the tmux server in another directory. If you
start it in /tmp/b it will have PWD=/tmp/b for all later sessions.
$ cd /tmp
$ tmux new -d
$ cd /tmp/b
$ tmux new 'env | grep ^PWD= ; read'
PWD=/tmp/a (in tmux)
The shell started by tmux cannot figure out the path including the
symlinks because PWD is pointing to /tmp when it is started. Simply
adding PWD to update-environment does not fix it as attaching from
another directory to a session will invalidate the value of $PWD.
I think tmux should ensure that the value of PWD is maintained as I
find it quite inconvenient if shells inside tmux expand the symlinks
in pwd as the prompt may get quite long and confusing.
> I did at one point consider just storing PWD in the tmux environment and
> dropping the various cwd members. Then whether or not it is updated
> would be entirely controlled by update-environment. This might be the
> best solution but still I think we should use getcwd() for the original
> working directory, not PWD. That is:
I also found that default-path and session->cwd is kind of redundant.
> - In the client, force PWD to getcwd() in the environment sent to the
> server.
I hope my point above makes clear why I think PWD should be used if it
points to the correct directory.
> - Add a comment marking the cwd part of the identify struct as unused
> and remove cwd from the session. It may need to stick around in the
> pane and window for respawning, in case the user has changed the
> environment. In fact, perhaps we should save the WHOLE environment for
> respawning.
>
> - Add PWD to update-environment by default.
In my opinion the cwd/PWD (whatever we name it) should be set by
default when creating a new session, not when attaching. Adding it to
update-environment would change the session directory on every attach.
> - Call chdir() to the value of PWD after fork or forkpty.
>
> Then the question of whether we update the working directory for new
> sessions or on attach or whatever is moot - it is handled by
> update-environment the same as everything else.
>
> >
> > Adding PWD to update-environ works for spawning new sessions but it will
> > break when attaching to an existing session from another path. New
> > windows in this session get the wrong $PWD.
> >
> > Additionally when setting the default-path the user has to set $PWD
> > manually too. And even then windows using remain-on-exit will get the
> > wrong $PWD when respawning. All this should be fixed with this patch.
>
> Respawning windows is supposed to recreate them in the same state as
> before (I know it doesn't really right now) so they shouldn't
> necessarily reflect any working directory changes.
Exactly, that's the reason why a window has to have its own value for
$PWD (or the whole environment). Otherwise it gets the wrong value
for $PWD.
> > Through all this I realised that tmux new will copy the whole
> > environment when no server is running yet. If a server is running
> > already only the update-environ variables are copied. I find this a bit
> > inconsistent that it makes a difference if a server is already running
> > or not. Wouldn't it make more sense to copy the whole environment for
> > every new session? For example CFLAGS="-Wall -W" tmux does set the
>
> Well, perhaps. But then you can't override parts of the environment.
>
> One idea when the environment stuff was added was to reverse the sense
> so the global environment overrides the session environment rather than
> vice versa, but that is inconsistent with options...
What do you mean by the last two paragraphs? I think every new
session should be the same, in the current implementation the first
session is special as the environment variables of this session are
used for all later sessions.
> This is an edge case but my feeling is that it is more intuitive for
> tmux to not change the session environment around under you except for
> some obvious, easily configurable cases like DISPLAY.
>
> Replacing the whole thing on attach has it's own problems. For example,
> what if you have two or three clients on the same session? When the
> session is created is the only time we are guaranteed there is only one
> source environment. Or what if I don't want it changed?
I really like the way update-environment is used to update sessions
when they are already running. Attaching to a session should in my
opinion not change the session state too much (i.e. cwd, the whole
environment or the like).
> A nice - and probably relatively easy - change here would be to make
> update-environment accept fnmatch() wildcards, so those who want the
> entire environment updated could just add "*" and those who wanted the
> entire environment removed add "-*".
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure
contains a definitive record of customers, application performance,
security threats, fraudulent activity, and more. Splunk takes this
data and makes sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-novd2d
_______________________________________________
tmux-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users