diff --git a/src/commands/alias/alias.test.ts b/src/commands/alias/alias.test.ts index 3c6ba840..a1887c0b 100644 --- a/src/commands/alias/alias.test.ts +++ b/src/commands/alias/alias.test.ts @@ -54,6 +54,19 @@ describe("alias command", () => { }); }); +describe("alias expansion with tilde", () => { + it("preserves ~/ in alias arguments", async () => { + const bash = new Bash({ + env: { HOME: "/home/user", BASH_ALIAS_ll: "ls -alF" }, + }); + await bash.exec("shopt -s expand_aliases"); + const direct = await bash.exec("ls -alF ~/"); + const aliased = await bash.exec("ll ~/"); + expect(aliased.stdout).toBe(direct.stdout); + expect(aliased.stderr).toBe(direct.stderr); + }); +}); + // Note: Alias expansion is NOT implemented to match real bash behavior. // In non-interactive mode (scripts), bash does not expand aliases. // The alias command only stores/lists alias definitions. diff --git a/src/interpreter/alias-expansion.ts b/src/interpreter/alias-expansion.ts index 8b29739e..fe77bd57 100644 --- a/src/interpreter/alias-expansion.ts +++ b/src/interpreter/alias-expansion.ts @@ -271,6 +271,10 @@ function wordNodeToString(word: WordNode): string { case "Glob": result += part.pattern; break; + case "TildeExpansion": + result += "~"; + if (part.user) result += part.user; + break; default: // For other types, try to preserve as-is break;