An argument for having trailing slashes in canonical directory paths

I was writing some GNU make today and remembered an age old question: “Should canonical directory paths contain a trailing slash (as in dir/) or not (as in dir)?”

I always thought that they shouldn’t (so, dir).

That makes concatenation easy: always do $dir/$suffix. The benefit is that we statically know that $dir must be a directory since the path separator is present literally at the concatenation site.

There are no duplicate slashes ever (hint: this is a lie), since $dir never contains a trailing slash, so no additional path cleaning (e.g. duplicate slash removal) needs to be done.

But I was wrong. The root directory will always contain a trailing slash, because that’s all that is (/). There’s no way to get rid of it. So the $dir/$suffix will always produce //$suffix when $dir is the root directory.

Repeated slashes are ugly. To fix the ugliness in data, in the code either a special check for / should be added or the path must be cleaned.

Well, we replaced the “ugly data” problem with ugly code.


So, perhaps canonical directory names should have a trailing slash in them, for simplicity of the general case.

Then concatenation becomes just $dir$suffix. There isn’t an literal path separator now at the concatenation site now, but an argument can be made that such information is not even that useful. $dir can just be a prefix like not-actually-in-a-new-directory-, which will be added as a prefix to $suffix. I can imagine where this behavior can be useful.

Did I miss anything?