Different symlink resolution in native console vs. terminal

Andrey Repin anrdaemon@yandex.ru
Fri Mar 19 13:29:23 GMT 2021


Greetings, L A Walsh!

> On 2021/03/10 14:51, Andrey Repin wrote:
>> Running `pwd -P` or `readlink -e .` in a specific directory from native
>> terminal provide unresolved answers.
>>
>> The directory $HOME/Documents/EVE is a symlink pointing to $HOME\Documents\Games\EVE.
>>
>> When running either command inside the directory from native terminal, the
>> result is literally /home/Documents/EVE, but when running the same command
>> from mintty inside same directory, the results may vary.
>>
>> $HOME/Documents/EVE or $HOME/Documents/Games/EVE (which is expected answer).
>> It also seems, there are results difference between `bash -l` `and bash -i`
>> and `pwd -P` and `readlink -e .`.
>> Generally, "pwd" is more correct.
>>   
> 1) When you look at the processes(native v mintty), are both the
> same #bits?

Interesting question. Originally I tested in 32-bit console, but it seems this
is not relevant.

$ START "" "%SystemRoot%\sysnative\cmd.exe"
$ CD /D "%USERPROFILE%\Documents\EVE"
$ readlink -e .
/home/anrdaemon/Documents/EVE

There's even MORE interesting sequence:

[anrdaemon@DAEMON2 C:\Users\anrdaemon\Documents\EVE]
$ bash -i
anrdaemon@daemon2:cygwin:~/Documents/EVE
$ readlink -e .
/home/anrdaemon/Documents/EVE
anrdaemon@daemon2:cygwin:~/Documents/EVE
$ cd "$( pwd )"
anrdaemon@daemon2:cygwin:~/Documents/EVE
$ readlink -e .
/home/anrdaemon/Documents/Games/EVE

> 2) Can you reproduce this with any other dir?

In fact. I picked a directory outside Cygwin mount table for this test:

[anrdaemon@DAEMON2 C:\]
$ MKLINK /J "C:\Games\KP2" "C:\Games\_old\KP2"
Junction created for C:\Games\KP2 <<===>> C:\Games\_old\KP2

[anrdaemon@DAEMON2 C:\Games]
$ CD /D "C:\Games\KP2"

[anrdaemon@DAEMON2 C:\Games\KP2]
$ pwd -P
/c/Games/KP2

[anrdaemon@DAEMON2 C:\Games\KP2]
$ readlink -e .
/c/Games/KP2

[anrdaemon@DAEMON2 C:\Games\KP2]
$ bash -i
anrdaemon@daemon2:cygwin:/c/Games/KP2
$ pwd -P
/c/Games/_old/KP2
anrdaemon@daemon2:cygwin:/c/Games/KP2
$ readlink -e .
/c/Games/KP2
anrdaemon@daemon2:cygwin:/c/Games/KP2
$ cd "$( pwd )"
anrdaemon@daemon2:cygwin:/c/Games/KP2
$ pwd -P
/c/Games/_old/KP2
anrdaemon@daemon2:cygwin:/c/Games/KP2
$ readlink -e .
/c/Games/_old/KP2

However, the C:\Games is a volume mount point. May be that is a problem?

Another test, this time no external factors, all directories in path are real:

[anrdaemon@DAEMON2 C:\]
$ MKLINK /J "C:\dev\php" "C:\dev\temp\install\php"

[anrdaemon@DAEMON2 C:\]
$ CD /D "C:\dev\php"

[anrdaemon@DAEMON2 C:\dev\php]
$ pwd -P
/c/dev/php

[anrdaemon@DAEMON2 C:\dev\php]
$ readlink -e .
/c/dev/php

> Both Documents and Games have multiple copies due to the public
> docs+games  are in the docs+games library (along with user versions).

As shown in the tests, this is not really a problem.

> Maybe the winterm is picking up a different file?

Eh? Terminal is just a display.

> I think one or both of those dirs have a GUID associated with them, maybe
> one is using a different GUID than the other?

???

> I also have Win7x64 but have never seen them misbehaving...

> How was your link made?

EVE is a symlink, but junctions behaving just the same and do not require
elevation to create.


-- 
With best regards,
Andrey Repin
Friday, March 19, 2021 15:49:11

Sorry for my terrible english...



More information about the Cygwin mailing list