purcell / exec-path-from-shell

Make Emacs use the $PATH set up by the user's shell
Other
1.41k stars 81 forks source link

Fish 3.0 breaks exec-path-from-shell #87

Closed agentultra closed 5 years ago

agentultra commented 5 years ago

Fish seems to have changed how it execs jobs to the foreground which breaks with how exec-path-from-shell invokes fish:

Invoking shell /opt/local/bin/fish with args ("-l" "-i" "-c" "sh -c /usr/bin/printf\\ \\'__RESULT\\\\000\\%s\\\\000\\%s\\\\000__RESULT\\'\\ \\\"\\$\\{PATH-eabe5e03b1a5dc668a61337c32e86caa\\}\\\"\\ \\\"\\$\\{MANPATH-eabe5e03b1a5dc668a61337c32e86caa\\}\\\"")
Shell printed: "<W> fish: Could not send job 9 ('echo \"begin; $argv \"\\n\" ;end <&3 3<&-\" | source 3<&0') with pgid 75714 to foreground
tcsetpgrp: Inappropriate ioctl for device
<W> fish: Could not send job 13 ('echo \"$fundle_dir/$plugin/$path\" | sed -e 's|/.$||'') with pgid 75715 to foreground
tcsetpgrp: Inappropriate ioctl for device
<W> fish: Could not send job 13 ('echo \"$fundle_dir/$plugin/$path\" | sed -e 's|/.$||'') with pgid 75715 to foreground
tcsetpgrp: Inappropriate ioctl for device
<W> fish: Could not send job 13 ('echo \"$fundle_dir/$plugin/$path\" | sed -e 's|/.$||'') with pgid 75715 to foreground
tcsetpgrp: Inappropriate ioctl for device
<W> fish: Could not send job 14 ('echo $plugin | awk -F/ '{print $NF}' | sed -e s/plugin-//') with pgid 75717 to foreground
tcsetpgrp: Inappropriate ioctl for device
<W> fish: Could not send job 14 ('echo $plugin | awk -F/ '{print $NF}' | sed -e s/plugin-//') with pgid 75717 to foreground
tcsetpgrp: Inappropriate ioctl for device
<W> fish: Could not send job 14 ('echo $plugin | awk -F/ '{print $NF}' | sed -e s/plugin-//') with pgid 75717 to foreground
tcsetpgrp: Inappropriate ioctl for device
<W> fish: Could not send job 14 ('echo $plugin | awk -F/ '{print $NF}' | sed -e s/plugin-//') with pgid 75717 to foreground
tcsetpgrp: Inappropriate ioctl for device
<E> fish: src/proc.cpp:420: failed assertion: (!job_fg || !job_fg->job_chain_is_fully_constructed() || !j->job_chain_is_fully_constructed()) && \"More than one active, fully-constructed foreground job!\"
<E> fish: Backtrace:
<E> fish: 0   process_mark_finished_children(bool) + 711
<E> fish: 1   job_reap(bool) + 28
<E> fish: 2   parse_execution_context_t::run_1_job(tnode_t<grammar::job>, block_t const*) + 1751
<E> fish: 3   parse_execution_context_t::run_job_conjunction(tnode_t<grammar::job_conjunction>, block_t const*) + 128
<E> fish: 4   parse_execution_result_t parse_execution_context_t::run_job_list<grammar::job_list>(tnode_t<grammar::job_list>, block_t const*) + 107
<E> fish: 5   parse_execution_context_t::eval_node(tnode_t<grammar::job_list>, block_t const*, io_chain_t const&) + 216
<E> fish: 6   int parser_t::eval_node<grammar::job_list>(std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, block_type_t, std::__1::shared_ptr<job_t>) + 255
<E> fish: 7   parser_t::eval(std::__1::shared_ptr<parsed_source_t const>, io_chain_t const&, block_type_t) + 133
<E> fish: 8   parser_t::eval(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >, io_chain_t const&, block_type_t) + 168
<E> fish: 9   exec_subshell_internal(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&, std::__1::vector<std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >, std::__1::allocator<std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > > >*, bool, bool) + 532
<E> fish: 10  expand_cmdsubst(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&, std::__1::vector<completion_t, std::__1::allocator<completion_t> >*, std::__1::vector<parse_error_t, std::__1::allocator<parse_error_t> >*) + 533
<E> fish: 11  expand_stage_cmdsubst(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >, std::__1::vector<completion_t, std::__1::allocator<completion_t> >*, int, std::__1::vector<parse_error_t, std::__1::allocator<parse_error_t> >*) + 43
<E> fish: 12  expand_string(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >, std::__1::vector<completion_t, std::__1::allocator<completion_t> >*, int, std::__1::vector<parse_error_t, std::__1::allocator<parse_error_t> >*) + 577
<E> fish: 13  parse_execution_context_t::expand_arguments_from_nodes(std::__1::vector<tnode_t<grammar::argument>, std::__1::allocator<tnode_t<grammar::argument> > > const&, std::__1::vector<std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >, std::__1::allocator<std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > > >*, parse_execution_context_t::globspec_t) + 276
<E> fish: 14  parse_execution_context_t::populate_plain_process(job_t*, process_t*, tnode_t<grammar::plain_statement>) + 1643
<E> fish: 15  parse_execution_context_t::populate_job_process(job_t*, process_t*, tnode_t<grammar::statement>) + 420
<E> fish: 16  parse_execution_context_t::populate_job_from_job_node(job_t*, tnode_t<grammar::job>, block_t const*) + 208
<E> fish: 17  parse_execution_context_t::run_1_job(tnode_t<grammar::job>, block_t const*) + 797
<E> fish: 18  parse_execution_context_t::run_job_conjunction(tnode_t<grammar::job_conjunction>, block_t const*) + 128
<E> fish: 19  parse_execution_result_t parse_execution_context_t::run_job_list<grammar::job_list>(tnode_t<grammar::job_list>, block_t const*) + 107
<E> fish: 20  parse_execution_context_t::eval_node(tnode_t<grammar::job_list>, block_t const*, io_chain_t const&) + 216
<E> fish: 21  int parser_t::eval_node<grammar::job_list>(std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, block_type_t, std::__1::shared_ptr<job_t>) + 255
<E> fish: 22  void internal_exec_helper<grammar::job_list>(parser_t&, std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, std::__1::shared_ptr<job_t>) + 205
<E> fish: 23  exec_job(parser_t&, std::__1::shared_ptr<job_t>) + 2971
<E> fish: 24  parse_execution_context_t::run_1_job(tnode_t<grammar::job>, block_t const*) + 1542
<E> fish: 25  parse_execution_context_t::run_job_conjunction(tnode_t<grammar::job_conjunction>, block_t const*) + 128
<E> fish: 26  parse_execution_result_t parse_execution_context_t::run_job_list<grammar::job_list>(tnode_t<grammar::job_list>, block_t const*) + 107
<E> fish: 27  parse_execution_context_t::run_begin_statement(tnode_t<grammar::job_list>) + 81
<E> fish: 28  parse_execution_context_t::run_block_statement(tnode_t<grammar::block_statement>, block_t const*) + 197
<E> fish: 29  parse_execution_context_t::eval_node(tnode_t<grammar::statement>, block_t const*, io_chain_t const&) + 127
<E> fish: 30  int parser_t::eval_node<grammar::statement>(std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::statement>, io_chain_t const&, block_type_t, std::__1::shared_ptr<job_t>) + 255
<E> fish: 31  void internal_exec_helper<grammar::statement>(parser_t&, std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::statement>, io_chain_t const&, std::__1::shared_ptr<job_t>) + 205
<E> fish: 32  exec_job(parser_t&, std::__1::shared_ptr<job_t>) + 2326
<E> fish: 33  parse_execution_context_t::run_1_job(tnode_t<grammar::job>, block_t const*) + 1542
<E> fish: 34  parse_execution_context_t::run_job_conjunction(tnode_t<grammar::job_conjunction>, block_t const*) + 128
<E> fish: 35  parse_execution_result_t parse_execution_context_t::run_job_list<grammar::job_list>(tnode_t<grammar::job_list>, block_t const*) + 107
<E> fish: 36  parse_execution_context_t::eval_node(tnode_t<grammar::job_list>, block_t const*, io_chain_t const&) + 216
<E> fish: 37  int parser_t::eval_node<grammar::job_list>(std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, block_type_t, std::__1::shared_ptr<job_t>) + 255
<E> fish: 38  parser_t::eval(std::__1::shared_ptr<parsed_source_t const>, io_chain_t const&, block_type_t) + 133
<E> fish: 39  reader_read(int, io_chain_t const&) + 3363
<E> fish: 40  builtin_source(parser_t&, io_streams_t&, wchar_t**) + 454
<E> fish: 41  builtin_run(parser_t&, int, wchar_t**, io_streams_t&) + 397
<E> fish: 42  exec_job(parser_t&, std::__1::shared_ptr<job_t>) + 4589
<E> fish: 43  parse_execution_context_t::run_1_job(tnode_t<grammar::job>, block_t const*) + 1542
<E> fish: 44  parse_execution_context_t::run_job_conjunction(tnode_t<grammar::job_conjunction>, block_t const*) + 128
<E> fish: 45  parse_execution_result_t parse_execution_context_t::run_job_list<grammar::job_list>(tnode_t<grammar::job_list>, block_t const*) + 107
<E> fish: 46  parse_execution_context_t::eval_node(tnode_t<grammar::job_list>, block_t const*, io_chain_t const&) + 216
<E> fish: 47  int parser_t::eval_node<grammar::job_list>(std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, block_type_t, std::__1::shared_ptr<job_t>) + 255
<E> fish: 48  void internal_exec_helper<grammar::job_list>(parser_t&, std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, std::__1::shared_ptr<job_t>) + 205
<E> fish: 49  exec_job(parser_t&, std::__1::shared_ptr<job_t>) + 2971
<E> fish: 50  parse_execution_context_t::run_1_job(tnode_t<grammar::job>, block_t const*) + 1542
<E> fish: 51  parse_execution_context_t::run_job_conjunction(tnode_t<grammar::job_conjunction>, block_t const*) + 128
<E> fish: 52  parse_execution_result_t parse_execution_context_t::run_job_list<grammar::job_list>(tnode_t<grammar::job_list>, block_t const*) + 107
<E> fish: 53  parse_execution_context_t::run_if_statement(tnode_t<grammar::if_statement>, block_t const*) + 448
<E> fish: 54  parse_execution_context_t::run_1_job(tnode_t<grammar::job>, block_t const*) + 1151
<E> fish: 55  parse_execution_context_t::run_job_conjunction(tnode_t<grammar::job_conjunction>, block_t const*) + 128
<E> fish: 56  parse_execution_result_t parse_execution_context_t::run_job_list<grammar::job_list>(tnode_t<grammar::job_list>, block_t const*) + 107
<E> fish: 57  parse_execution_context_t::eval_node(tnode_t<grammar::job_list>, block_t const*, io_chain_t const&) + 216
<E> fish: 58  int parser_t::eval_node<grammar::job_list>(std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, block_type_t, std::__1::shared_ptr<job_t>) + 255
<E> fish: 59  void internal_exec_helper<grammar::job_list>(parser_t&, std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, std::__1::shared_ptr<job_t>) + 205
<E> fish: 60  exec_job(parser_t&, std::__1::shared_ptr<job_t>) + 2971
<E> fish: 61  parse_execution_context_t::run_1_job(tnode_t<grammar::job>, block_t const*) + 1542
<E> fish: 62  parse_execution_context_t::run_job_conjunction(tnode_t<grammar::job_conjunction>, block_t const*) + 128
<E> fish: 63  parse_execution_result_t parse_execution_context_t::run_job_list<grammar::job_list>(tnode_t<grammar::job_list>, block_t const*) + 107
<E> fish: 64  parse_execution_context_t::run_for_statement(tnode_t<grammar::for_header>, tnode_t<grammar::job_list>) + 700
<E> fish: 65  parse_execution_context_t::run_block_statement(tnode_t<grammar::block_statement>, block_t const*) + 98
<E> fish: 66  parse_execution_context_t::run_1_job(tnode_t<grammar::job>, block_t const*) + 433
<E> fish: 67  parse_execution_context_t::run_job_conjunction(tnode_t<grammar::job_conjunction>, block_t const*) + 128
<E> fish: 68  parse_execution_result_t parse_execution_context_t::run_job_list<grammar::job_list>(tnode_t<grammar::job_list>, block_t const*) + 107
<E> fish: 69  parse_execution_context_t::eval_node(tnode_t<grammar::job_list>, block_t const*, io_chain_t const&) + 216
<E> fish: 70  int parser_t::eval_node<grammar::job_list>(std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, block_type_t, std::__1::shared_ptr<job_t>) + 255
<E> fish: 71  void internal_exec_helper<grammar::job_list>(parser_t&, std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, std::__1::shared_ptr<job_t>) + 205
<E> fish: 72  exec_job(parser_t&, std::__1::shared_ptr<job_t>) + 2971
<E> fish: 73  parse_execution_context_t::run_1_job(tnode_t<grammar::job>, block_t const*) + 1542
<E> fish: 74  parse_execution_context_t::run_job_conjunction(tnode_t<grammar::job_conjunction>, block_t const*) + 128
<E> fish: 75  parse_execution_result_t parse_execution_context_t::run_job_list<grammar::job_list>(tnode_t<grammar::job_list>, block_t const*) + 107
<E> fish: 76  parse_execution_context_t::run_switch_statement(tnode_t<grammar::switch_statement>) + 855
<E> fish: 77  parse_execution_context_t::run_1_job(tnode_t<grammar::job>, block_t const*) + 1106
<E> fish: 78  parse_execution_context_t::run_job_conjunction(tnode_t<grammar::job_conjunction>, block_t const*) + 128
<E> fish: 79  parse_execution_result_t parse_execution_context_t::run_job_list<grammar::job_list>(tnode_t<grammar::job_list>, block_t const*) + 107
<E> fish: 80  parse_execution_context_t::eval_node(tnode_t<grammar::job_list>, block_t const*, io_chain_t const&) + 216
<E> fish: 81  int parser_t::eval_node<grammar::job_list>(std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, block_type_t, std::__1::shared_ptr<job_t>) + 255
<E> fish: 82  void internal_exec_helper<grammar::job_list>(parser_t&, std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, std::__1::shared_ptr<job_t>) + 205
<E> fish: 83  exec_job(parser_t&, std::__1::shared_ptr<job_t>) + 2971
<E> fish: 84  parse_execution_context_t::run_1_job(tnode_t<grammar::job>, block_t const*) + 1542
<E> fish: 85  parse_execution_context_t::run_job_conjunction(tnode_t<grammar::job_conjunction>, block_t const*) + 128
<E> fish: 86  parse_execution_result_t parse_execution_context_t::run_job_list<grammar::job_list>(tnode_t<grammar::job_list>, block_t const*) + 107
<E> fish: 87  parse_execution_context_t::eval_node(tnode_t<grammar::job_list>, block_t const*, io_chain_t const&) + 216
<E> fish: 88  int parser_t::eval_node<grammar::job_list>(std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, block_type_t, std::__1::shared_ptr<job_t>) + 255
<E> fish: 89  parser_t::eval(std::__1::shared_ptr<parsed_source_t const>, io_chain_t const&, block_type_t) + 133
<E> fish: 90  reader_read(int, io_chain_t const&) + 3363
<E> fish: 91  builtin_source(parser_t&, io_streams_t&, wchar_t**) + 454
<E> fish: 92  builtin_run(parser_t&, int, wchar_t**, io_streams_t&) + 397
<E> fish: 93  exec_job(parser_t&, std::__1::shared_ptr<job_t>) + 4589
<E> fish: 94  parse_execution_context_t::run_1_job(tnode_t<grammar::job>, block_t const*) + 1542
<E> fish: 95  parse_execution_context_t::run_job_conjunction(tnode_t<grammar::job_conjunction>, block_t const*) + 128
<E> fish: 96  parse_execution_result_t parse_execution_context_t::run_job_list<grammar::job_list>(tnode_t<grammar::job_list>, block_t const*) + 107
<E> fish: 97  parse_execution_context_t::eval_node(tnode_t<grammar::job_list>, block_t const*, io_chain_t const&) + 216
<E> fish: 98  int parser_t::eval_node<grammar::job_list>(std::__1::shared_ptr<parsed_source_t const>, tnode_t<grammar::job_list>, io_chain_t const&, block_type_t, std::__1::shared_ptr<job_t>) + 255
"
if: Wrong type argument: number-or-marker-p, "Abort trap: 6"
next-line: End of buffer
Mark set
Mark activated

MacOS 10.12.6, Fish 3.0.0, Emacs 26.1+

purcell commented 5 years ago

Thanks for the report. I don't use Fish myself, but if someone can suggest a fix for this I'd be happy to incorporate it.

agentultra commented 5 years ago

It looks like if you remove the "-i" from the shell arguments it works.

purcell commented 5 years ago

Hopefully 76cd6e3 will help - perhaps you could confirm and close this issue if so?

agentultra commented 5 years ago

It does, cheers!

krishicks commented 5 years ago

I'm running Arch Linux where the recommended way to start fish is to use bash as your default shell but to add exec fish to your .bashrc. Even with this commit I was getting errors until I used the alternate implementation listed in ArchWiki:

  • To have commands such as bash -c 'echo test' run the command in Bash instead of starting fish, you can write if [ -z "$BASH_EXECUTION_STRING" ]; then exec fish; fi instead.
purcell commented 5 years ago

I'm running Arch Linux where the recommended way to start fish is to use bash as your default shell but to add exec fish to your .bashrc. Even with this commit I was getting errors until I used the alternate implementation listed in ArchWiki:

I guess then you'd have to decide between setting your env vars in the bash startup files or the fish ones. It then begs the question of which "your" $SHELL really is. If you set things up this way, I'd imagine you'd put env vars in the bash startup files, and your shell would be bash as far as Emacs is concerned. And in that case, you should be avoiding including -i in exec-path-from-shell-arguments, as noted in the docs, which would prevent bash from even executing .bashrc.

krishicks commented 5 years ago

Yep, I ended up moving my env vars over to .bashrc along with the above.

I'm using spacemacs and am not sure how to modify how it invokes exec-path-from-shell, but it seems to work fine for now.

Thanks!