From 676a97cf0be47a7164fd8bf5384c0bfda04f4dc7 Mon Sep 17 00:00:00 2001 From: Johannes Altmanninger Date: Mon, 24 Feb 2020 00:16:12 +0100 Subject: [PATCH] Skip variable assignments in `status current command` Fixes #6635 (cherry picked from commit aa0e16b1a556798d6d276531e80fa5fc392bf1a8) --- src/builtin_fg.cpp | 2 +- src/reader.cpp | 2 +- src/tokenizer.cpp | 15 +++++++++++++++ src/tokenizer.h | 3 +++ tests/status.in | 3 +++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/builtin_fg.cpp b/src/builtin_fg.cpp index 628e76470..ca363688c 100644 --- a/src/builtin_fg.cpp +++ b/src/builtin_fg.cpp @@ -98,7 +98,7 @@ int builtin_fg(parser_t &parser, io_streams_t &streams, wchar_t **argv) { std::fwprintf(stderr, FG_MSG, job->job_id(), job->command_wcstr()); } - const wcstring ft = tok_first(job->command()); + const wcstring ft = tok_command(job->command()); // For compatibility with fish 2.0's $_, now replaced with `status current-command` if (!ft.empty()) parser.vars().set_one(L"_", ENV_EXPORT, ft); reader_write_title(job->command(), parser); diff --git a/src/reader.cpp b/src/reader.cpp index 62c7d4938..970ebfb74 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -1943,7 +1943,7 @@ void set_env_cmd_duration(struct timeval *after, struct timeval *before, env_sta void reader_run_command(parser_t &parser, const wcstring &cmd) { struct timeval time_before, time_after; - wcstring ft = tok_first(cmd); + wcstring ft = tok_command(cmd); // For compatibility with fish 2.0's $_, now replaced with `status current-command` if (!ft.empty()) parser.vars().set_one(L"_", ENV_GLOBAL, ft); diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 992f7b6b3..f899fecfa 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -663,6 +663,21 @@ wcstring tok_first(const wcstring &str) { return {}; } +wcstring tok_command(const wcstring &str) { + tokenizer_t t(str.c_str(), 0); + while (auto token = t.next()) { + if (token->type != token_type_t::string) { + return {}; + } + wcstring text = t.text_of(*token); + if (variable_assignment_equals_pos(text)) { + continue; + } + return text; + } + return {}; +} + bool move_word_state_machine_t::consume_char_punctuation(wchar_t c) { enum { s_always_one = 0, s_rest, s_whitespace_rest, s_whitespace, s_alphanumeric, s_end }; diff --git a/src/tokenizer.h b/src/tokenizer.h index 90563b701..3d0f7204c 100644 --- a/src/tokenizer.h +++ b/src/tokenizer.h @@ -144,6 +144,9 @@ class tokenizer_t { /// returns the empty string. wcstring tok_first(const wcstring &str); +/// Like to tok_first, but skip variable assignments like A=B. +wcstring tok_command(const wcstring &str); + /// Struct wrapping up a parsed pipe or redirection. struct pipe_or_redir_t { // The redirected fd, or -1 on overflow. diff --git a/tests/status.in b/tests/status.in index ad68a9231..9ed79a660 100644 --- a/tests/status.in +++ b/tests/status.in @@ -37,6 +37,9 @@ status job-control none # Check status -u outside functions status current-function +a=b status current-command +#CHECK: status + function test_function status current-function end