diff --git a/exec.cpp b/exec.cpp index ae4c496db..f2d168a9f 100644 --- a/exec.cpp +++ b/exec.cpp @@ -592,6 +592,7 @@ void exec_job(parser_t &parser, job_t *j) CHECK(j,); CHECK_BLOCK(); + /* If fish was invoked with -n or --no-execute, then no_exec will be set and we do nothing. */ if (no_exec) { return; diff --git a/parse_execution.cpp b/parse_execution.cpp index 03066ba72..22c132858 100644 --- a/parse_execution.cpp +++ b/parse_execution.cpp @@ -673,6 +673,12 @@ parse_execution_result_t parse_execution_context_t::run_while_statement(const pa break; } } + + /* no_exec means that fish was invoked with -n or --no-execute. If set, we allow the loop to not-execute once so its contents can be checked, and then break */ + if (no_exec) + { + break; + } } /* Done */ diff --git a/tests/test1.in b/tests/test1.in index 4de8d6b1f..424b931a6 100644 --- a/tests/test1.in +++ b/tests/test1.in @@ -123,6 +123,10 @@ echo -e Catch your breath echo -e 'abc\x21def' echo -e 'abc\x211def' +# Make sure while loops don't run forever with no-exec (#1543) +echo "Checking for infinite loops in no-execute" +echo "while true; end" | ../fish --no-execute + function always_fails if true return 1 diff --git a/tests/test1.out b/tests/test1.out index 85a6d2259..e79d75bc9 100644 --- a/tests/test1.out +++ b/tests/test1.out @@ -37,4 +37,5 @@ abc Catch your breath abc!def abc!1def +Checking for infinite loops in no-execute 1