bash: use a shell command for shell integration (#9875)
Prior to #7044, on macOS, our shell-integrated command line would be executed under `exec -l`, which causes bash to be started as a login shell. This matches the macOS platform norms. The change to direct command execution meant that we'd skip that path, and bash would start as a normal interactive (non-login) shell on macOS. We fixed this in #7253 by adding `--login` to the `bash` direct command on macOS. This avoided some of the overhead of starting an extra process just to get a login shell, but it unfortunately doesn't quite match the bash environment we get when shell integration isn't enabled (namely, `$0` doesn't get the login-shell-identifying `-` prefix). Instead, this change implements the approach proposed in #7254, which switches the bash shell integration path to use a `.shell` command, giving us the same execution environment as the non-shell-integrated command.pull/9877/head
commit
2448a90c30
|
|
@ -259,7 +259,7 @@ fn setupBash(
|
|||
resource_dir: []const u8,
|
||||
env: *EnvMap,
|
||||
) !?config.Command {
|
||||
var args: std.ArrayList([:0]const u8) = try .initCapacity(alloc, 3);
|
||||
var args: std.ArrayList([:0]const u8) = try .initCapacity(alloc, 2);
|
||||
defer args.deinit(alloc);
|
||||
|
||||
// Iterator that yields each argument in the original command line.
|
||||
|
|
@ -273,11 +273,6 @@ fn setupBash(
|
|||
} else return null;
|
||||
try args.append(alloc, "--posix");
|
||||
|
||||
// On macOS, we request a login shell to match that platform's norms.
|
||||
if (comptime builtin.target.os.tag.isDarwin()) {
|
||||
try args.append(alloc, "--login");
|
||||
}
|
||||
|
||||
// Stores the list of intercepted command line flags that will be passed
|
||||
// to our shell integration script: --norc --noprofile
|
||||
// We always include at least "1" so the script can differentiate between
|
||||
|
|
@ -357,9 +352,8 @@ fn setupBash(
|
|||
);
|
||||
try env.put("ENV", integ_dir);
|
||||
|
||||
// Since we built up a command line, we don't need to wrap it in
|
||||
// ANOTHER shell anymore and can do a direct command.
|
||||
return .{ .direct = try args.toOwnedSlice(alloc) };
|
||||
// Join the accumulated arguments to form the final command string.
|
||||
return .{ .shell = try std.mem.joinZ(alloc, " ", args.items) };
|
||||
}
|
||||
|
||||
test "bash" {
|
||||
|
|
@ -373,12 +367,7 @@ test "bash" {
|
|||
|
||||
const command = try setupBash(alloc, .{ .shell = "bash" }, ".", &env);
|
||||
|
||||
try testing.expect(command.?.direct.len >= 2);
|
||||
try testing.expectEqualStrings("bash", command.?.direct[0]);
|
||||
try testing.expectEqualStrings("--posix", command.?.direct[1]);
|
||||
if (comptime builtin.target.os.tag.isDarwin()) {
|
||||
try testing.expectEqualStrings("--login", command.?.direct[2]);
|
||||
}
|
||||
try testing.expectEqualStrings("bash --posix", command.?.shell);
|
||||
try testing.expectEqualStrings("./shell-integration/bash/ghostty.bash", env.get("ENV").?);
|
||||
try testing.expectEqualStrings("1", env.get("GHOSTTY_BASH_INJECT").?);
|
||||
}
|
||||
|
|
@ -421,12 +410,7 @@ test "bash: inject flags" {
|
|||
|
||||
const command = try setupBash(alloc, .{ .shell = "bash --norc" }, ".", &env);
|
||||
|
||||
try testing.expect(command.?.direct.len >= 2);
|
||||
try testing.expectEqualStrings("bash", command.?.direct[0]);
|
||||
try testing.expectEqualStrings("--posix", command.?.direct[1]);
|
||||
if (comptime builtin.target.os.tag.isDarwin()) {
|
||||
try testing.expectEqualStrings("--login", command.?.direct[2]);
|
||||
}
|
||||
try testing.expectEqualStrings("bash --posix", command.?.shell);
|
||||
try testing.expectEqualStrings("1 --norc", env.get("GHOSTTY_BASH_INJECT").?);
|
||||
}
|
||||
|
||||
|
|
@ -437,12 +421,7 @@ test "bash: inject flags" {
|
|||
|
||||
const command = try setupBash(alloc, .{ .shell = "bash --noprofile" }, ".", &env);
|
||||
|
||||
try testing.expect(command.?.direct.len >= 2);
|
||||
try testing.expectEqualStrings("bash", command.?.direct[0]);
|
||||
try testing.expectEqualStrings("--posix", command.?.direct[1]);
|
||||
if (comptime builtin.target.os.tag.isDarwin()) {
|
||||
try testing.expectEqualStrings("--login", command.?.direct[2]);
|
||||
}
|
||||
try testing.expectEqualStrings("bash --posix", command.?.shell);
|
||||
try testing.expectEqualStrings("1 --noprofile", env.get("GHOSTTY_BASH_INJECT").?);
|
||||
}
|
||||
}
|
||||
|
|
@ -459,24 +438,14 @@ test "bash: rcfile" {
|
|||
// bash --rcfile
|
||||
{
|
||||
const command = try setupBash(alloc, .{ .shell = "bash --rcfile profile.sh" }, ".", &env);
|
||||
try testing.expect(command.?.direct.len >= 2);
|
||||
try testing.expectEqualStrings("bash", command.?.direct[0]);
|
||||
try testing.expectEqualStrings("--posix", command.?.direct[1]);
|
||||
if (comptime builtin.target.os.tag.isDarwin()) {
|
||||
try testing.expectEqualStrings("--login", command.?.direct[2]);
|
||||
}
|
||||
try testing.expectEqualStrings("bash --posix", command.?.shell);
|
||||
try testing.expectEqualStrings("profile.sh", env.get("GHOSTTY_BASH_RCFILE").?);
|
||||
}
|
||||
|
||||
// bash --init-file
|
||||
{
|
||||
const command = try setupBash(alloc, .{ .shell = "bash --init-file profile.sh" }, ".", &env);
|
||||
try testing.expect(command.?.direct.len >= 2);
|
||||
try testing.expectEqualStrings("bash", command.?.direct[0]);
|
||||
try testing.expectEqualStrings("--posix", command.?.direct[1]);
|
||||
if (comptime builtin.target.os.tag.isDarwin()) {
|
||||
try testing.expectEqualStrings("--login", command.?.direct[2]);
|
||||
}
|
||||
try testing.expectEqualStrings("bash --posix", command.?.shell);
|
||||
try testing.expectEqualStrings("profile.sh", env.get("GHOSTTY_BASH_RCFILE").?);
|
||||
}
|
||||
}
|
||||
|
|
@ -538,35 +507,13 @@ test "bash: additional arguments" {
|
|||
// "-" argument separator
|
||||
{
|
||||
const command = try setupBash(alloc, .{ .shell = "bash - --arg file1 file2" }, ".", &env);
|
||||
try testing.expect(command.?.direct.len >= 6);
|
||||
try testing.expectEqualStrings("bash", command.?.direct[0]);
|
||||
try testing.expectEqualStrings("--posix", command.?.direct[1]);
|
||||
if (comptime builtin.target.os.tag.isDarwin()) {
|
||||
try testing.expectEqualStrings("--login", command.?.direct[2]);
|
||||
}
|
||||
|
||||
const offset = if (comptime builtin.target.os.tag.isDarwin()) 3 else 2;
|
||||
try testing.expectEqualStrings("-", command.?.direct[offset + 0]);
|
||||
try testing.expectEqualStrings("--arg", command.?.direct[offset + 1]);
|
||||
try testing.expectEqualStrings("file1", command.?.direct[offset + 2]);
|
||||
try testing.expectEqualStrings("file2", command.?.direct[offset + 3]);
|
||||
try testing.expectEqualStrings("bash --posix - --arg file1 file2", command.?.shell);
|
||||
}
|
||||
|
||||
// "--" argument separator
|
||||
{
|
||||
const command = try setupBash(alloc, .{ .shell = "bash -- --arg file1 file2" }, ".", &env);
|
||||
try testing.expect(command.?.direct.len >= 6);
|
||||
try testing.expectEqualStrings("bash", command.?.direct[0]);
|
||||
try testing.expectEqualStrings("--posix", command.?.direct[1]);
|
||||
if (comptime builtin.target.os.tag.isDarwin()) {
|
||||
try testing.expectEqualStrings("--login", command.?.direct[2]);
|
||||
}
|
||||
|
||||
const offset = if (comptime builtin.target.os.tag.isDarwin()) 3 else 2;
|
||||
try testing.expectEqualStrings("--", command.?.direct[offset + 0]);
|
||||
try testing.expectEqualStrings("--arg", command.?.direct[offset + 1]);
|
||||
try testing.expectEqualStrings("file1", command.?.direct[offset + 2]);
|
||||
try testing.expectEqualStrings("file2", command.?.direct[offset + 3]);
|
||||
try testing.expectEqualStrings("bash --posix -- --arg file1 file2", command.?.shell);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue