You've got the order reversed there - the first item found in your PATH will be used, and therefore earlier directories in your PATH have higher precedence:
jfred@lambdacrypt ~$ cat dir1/pathtest
#!/run/current-system/profile/bin/bash
echo "script in dir1"
jfred@lambdacrypt ~$ cat dir2/pathtest
#!/run/current-system/profile/bin/bash
echo "script in dir2"
jfred@lambdacrypt ~$ PATH=$HOME/dir1:$HOME/dir2 pathtest
script in dir1Don't install binaries anywhere in your path if you don't trust them or know where they came from. (Also, sibling is correct that first location found wins when searching PATH for a command name.)
Also, it's not unreasonable to trust npm packages just like OS packages if you know who released it. NPM names are first-come, first-served, and once allocated, they are permanent. If you know and trust the person who released the package, there's nothing wrong with trusting the package. This was, in fact, the norm when npm was new and the community was small and most people knew each other. The only problem is with treating npm like a vetted distro like Debian, and assuming that anything on npm is safe to install without any connection to the author (or 1001 dependencies). That's where everything started to go sideways.
The parent was highlighting how the article points out you can overwrite root files:
> "bin": { "/usr/bin/date": "./fake-date" }
This is not possible with ~/.local
I wouldn't call this a "security feature", but I would call it prudent to not hand over root access to npm packages.
> Also, it's not unreasonable to trust npm packages just like OS packages if you know who released it. NPM names are first-come, first-served, and once allocated, they are permanent. If you know and trust the person who released the package, there's nothing wrong with trusting the package.
This is not the problem with npm, the problem is dependencies, and their dependencies and so on. I certainly will never be able to personally vet the 1000 deep nest of dependencies in an npm package I may have to use.
> "bin": { "/usr/bin/date": "./fake-date" }
This will only possibly work if you install it with root privileges... at which point you need to have a reasonable level of trust of the script you are running. It's unreasonable to give the same level of trust to npm packages that you do your OS package manager since anyone can publish an npm package without anyone elses permission.
For this reason I think npm's defaults are a really shitty choice (global prefix under root). I always change the global prefix to live in my user directory for this reason so I can npm install -g without root:
You will need to add the local bin to your PATH (if it doesn't already contain it) The order above is important, local must come before existing PATHs for lower precedence so that it cannot override higher privilege bins... e.g so that if an npm package added a bin for '~/.local/bin/cat', it would never be called implicitly since '/usr/bin/cat' exists.