8

I've added LaTeX to the PATH variable, but as I'm transferring my shell configuration to multiple computers, LaTeX is not installed on all of them. Besides the obvious consequence of being unable to access the software, could there be any additional negative effects of having the PATH variable configured when the software it refers to is not present on the system?

My .zshenv file:

# TeX Live
export PATH=$PATH:/usr/local/texlive/2023/bin/x86_64-linux

4 Answers 4

13

None. Your shell will spend ~0.00005 seconds trying to open this location, fail and move on.

The only real possible issue could arise if this location is on an inaccessible remote filesystem. This may result in a minute long delay each time you try to autocomplete a command.

3

This can have a few potential negative effects, but actually not significant.

  1. Whenever you try to run a command that relies on the software in the added directory but is not installed, you will likely receive error messages indicating that the command or executable cannot be found.

  2. If you have a command or executable name in the added directory that conflicts with an existing command on the system, it may lead to unexpected behavior.

  3. When the shell encounters a command, it searches for it in the directories listed in the PATH variable. If the software you're referencing is not installed, the shell will have to search through all the directories in the PATH before determining that the command is not available. This additional search time can lead to a slight delay in command execution.

You can add an if statement to check if the software is present before performing the export.

If you are transferring your shell configuration to multiple computers, you may consider creating separate configuration files for each computer and customizing the PATH variable accordingly based on the software available on each system.

Or include additional checks in your shell configuration to verify the presence of required software or directories.

6
  • 4
    The first bullet will happen with or without custom PATH, isn't it? Or include additional checks in your shell configuration to verify the presence of required software or directories. Like adding a directory to PATH only if it exists?
    – A.L
    Jul 9, 2023 at 17:59
  • 2
    #2 makes no sense -- the directory doesn't exist, so how can it create a conflict?
    – Barmar
    Jul 9, 2023 at 21:55
  • 3
    #3 shouldn't be a significant problem. The time to search a nonexistent directory is negligible -- it simply gets an error when trying to open the directory and skips it. And shells keep a cache of locations of commands, so often there's no search.
    – Barmar
    Jul 9, 2023 at 21:56
  • 2
    @Barmar I think the point with #2 is this: if you use a custom PATH to "override" binary /usr/bin/xyz with /opt/custom/xyz, then on a machine with no xyz at all you'll simply get a "command not found" error, but on a machine with the standard /usr/bin/xyz but not the /opt/custom/xyz then you could end up accidentally running one program with an invocation intended for another. The consequences of that could range from nothing at all, to obvious error, to silent and irrecoverable data loss; depending on the exact program we're talking about and how contrived the scenario is.
    – Ben
    Jul 11, 2023 at 3:13
  • 2
    @Barmar Most likely yes, but this is an answer going through the potential negative effects of using a PATH from one machine on another machine that doesn't have all of those packages installed. It's a good thing to mention. The answer is more useful for other users if it touches on things relevant to other similar-but-not-precisely-the-same situations.
    – Ben
    Jul 11, 2023 at 5:16
3

Adding a directory to $PATH adds overhead to the process of running programs. The shell tries to optimize this away, but even outside the shell, this overhead is typically insignificant, and even more so for a directory that doesn't exist.

Adding the same directory multiple times (as your example has the potential to do) is ugly, but still typically insignificant for performance.

There are security implications to adding an untrusted directory to your path, but I think those don't apply in this case as it is a non-existent directory rather than untrusted, and the potential parents should be root owned.

Probably the very worst possible outcome would be if the disk the directory was on happened to be on a failing disk (for instance, a NFS mount point to an unresponsive server), but this is not a general case. (The result would be very slow or possibly failed logins.)

4
  • 6
    Here, it's added at the end, so that directory will only ever be searched for commands that don't exist. Jul 8, 2023 at 12:00
  • I did say it was insignificant. That's just one more way it is insignificant. And just because it is at the end after this line doesn't mean you aren't adding more things to the end of the path later to shat this isn't at the end.
    – user10489
    Jul 8, 2023 at 12:16
  • Is there not a security risk if a malicious person could create the directory and put their own executables inside?
    – gidds
    Jul 8, 2023 at 19:18
  • 1
    Yes, there is a security risk there. I said that. But /usr/local/ is usually root owned, so not likely a security risk.
    – user10489
    Jul 8, 2023 at 21:17
1

Depending on where you place this in your path, and if the directory / files matching that path can be created by a regular user, there might be a security issue.

If it is close to the beginning of the path, then there is the possibility that a person with sufficient permissions to create a directory to match the path, and executables within that directory could place script named after a commonly trusted executable like ls to be called prior to the actual ls.

Normally, this kind of attack is for information gathering among other users who eventually will type the command. The fake ls could fetch user information, run commands as that user, and even send such information off system. Normally such scripts will also run the real ls and pipe the reply back to the console, to delay the discovery of interception.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .