diff --git a/docs/diff-tool.md b/docs/diff-tool.md
index e251516f..e803b25c 100644
--- a/docs/diff-tool.md
+++ b/docs/diff-tool.md
@@ -316,7 +316,7 @@ DiffTools.UseOrder(DiffTool.DiffEngineViewer);
"tempFile.txt" "targetFile.txt"
```
* Scanned paths:
- * `$HOME/.dotnet/tools/DiffEngineViewer`
+ * `%HOME%/.dotnet/tools/DiffEngineViewer`
* `%PATH%DiffEngineViewer`
#### Linux settings:
@@ -330,7 +330,7 @@ DiffTools.UseOrder(DiffTool.DiffEngineViewer);
"tempFile.txt" "targetFile.txt"
```
* Scanned paths:
- * `$HOME/.dotnet/tools/DiffEngineViewer`
+ * `%HOME%/.dotnet/tools/DiffEngineViewer`
* `%PATH%DiffEngineViewer`
### [Diffinity](https://truehumandesign.se/s_diffinity.php)
diff --git a/src/DiffEngine.Tests/SearchDirectoryExpansionTests.cs b/src/DiffEngine.Tests/SearchDirectoryExpansionTests.cs
new file mode 100644
index 00000000..2c2bdf10
--- /dev/null
+++ b/src/DiffEngine.Tests/SearchDirectoryExpansionTests.cs
@@ -0,0 +1,41 @@
+///
+/// Search directories are written in the one syntax that gets expanded.
+///
+/// WildcardFileFinder expands with Environment.ExpandEnvironmentVariables, which only understands
+/// %NAME%. A directory written shell style with $HOME was passed through untouched, so it named a
+/// literal directory called "$HOME" and never matched - which is why a globally installed
+/// DiffEngineViewer was invisible on Linux and macOS whenever the bundled copy was absent.
+///
+///
+public class SearchDirectoryExpansionTests
+{
+ [Test]
+ public async Task NoDefinitionUsesShellStyleExpansion()
+ {
+ var shellStyle = Definitions.Tools
+ .SelectMany(
+ definition => Directories(definition)
+ .Where(_ => _.Contains('$'))
+ .Select(_ => $"{definition.Tool}: {_}"))
+ .ToList();
+
+ await Assert.That(shellStyle).IsEmpty();
+ }
+
+ static IEnumerable Directories(Definition definition)
+ {
+ var support = definition.OsSupport;
+ foreach (var settings in new[] { support.Windows, support.Linux, support.Osx })
+ {
+ if (settings == null)
+ {
+ continue;
+ }
+
+ foreach (var directory in settings.SearchDirectories)
+ {
+ yield return directory;
+ }
+ }
+ }
+}
diff --git a/src/DiffEngine.Tests/diffTools.include.md b/src/DiffEngine.Tests/diffTools.include.md
index f6243f7b..1a99761c 100644
--- a/src/DiffEngine.Tests/diffTools.include.md
+++ b/src/DiffEngine.Tests/diffTools.include.md
@@ -181,7 +181,7 @@ DiffTools.UseOrder(DiffTool.DiffEngineViewer);
"tempFile.txt" "targetFile.txt"
```
* Scanned paths:
- * `$HOME/.dotnet/tools/DiffEngineViewer`
+ * `%HOME%/.dotnet/tools/DiffEngineViewer`
* `%PATH%DiffEngineViewer`
#### Linux settings:
@@ -195,7 +195,7 @@ DiffTools.UseOrder(DiffTool.DiffEngineViewer);
"tempFile.txt" "targetFile.txt"
```
* Scanned paths:
- * `$HOME/.dotnet/tools/DiffEngineViewer`
+ * `%HOME%/.dotnet/tools/DiffEngineViewer`
* `%PATH%DiffEngineViewer`
### [Diffinity](https://truehumandesign.se/s_diffinity.php)
diff --git a/src/DiffEngine/Implementation/DiffEngineViewer.cs b/src/DiffEngine/Implementation/DiffEngineViewer.cs
index ac344921..88627735 100644
--- a/src/DiffEngine/Implementation/DiffEngineViewer.cs
+++ b/src/DiffEngine/Implementation/DiffEngineViewer.cs
@@ -23,11 +23,11 @@ public static Definition DiffEngineViewer()
Linux: new(
"DiffEngineViewer",
launchArguments,
- SearchDirectories("$HOME/.dotnet/tools/")),
+ SearchDirectories("%HOME%/.dotnet/tools/")),
Osx: new(
"DiffEngineViewer",
launchArguments,
- SearchDirectories("$HOME/.dotnet/tools/"))),
+ SearchDirectories("%HOME%/.dotnet/tools/"))),
UseShellExecute: false,
// Console subsystem, so without this a window flashes on every launch.
CreateNoWindow: true,