skywind3000 / asynctasks.vim

:rocket: Modern Task System for Project Building, Testing and Deploying !!
https://www.vim.org/scripts/script.php?script_id=5853
MIT License
915 stars 30 forks source link

hi, the default shell(dash) of Ubuntu does not support `(` in expressions. #91

Closed cstsunfu closed 2 years ago

cstsunfu commented 2 years ago

This is the task:

[vim-grep-word-clean]
command=vi -u NONE -q <(rg -n --no-heading --color never "$(?keyword)" "<root>" -tc -tcpp -tpy -tvim -tgo -tlua)
cwd=$(VIM_ROOT)
errorformat=%f:%l:%m
output=quickfix

When I run this task in the terminal, the shell will raise an error:

Input argument (keyword): anything
sh: 1: Syntax error: "(" unexpected

非常诡异的是这个task之前我是成功执行过的,不知道为什么后面试了好多次都再不能成功了。 特来求教大佬 orz

skywind3000 commented 2 years ago

输入部分 $(?keyword) 已经换成 $(-keyword) 了,看这里:

https://github.com/skywind3000/asynctasks.vim/blob/master/README-cn.md#%E4%BA%A4%E4%BA%92%E5%BC%8F%E4%BB%BB%E5%8A%A1

cstsunfu commented 2 years ago

输入部分 $(?keyword) 已经换成 $(-keyword) 了,看这里:

https://github.com/skywind3000/asynctasks.vim/blob/master/README-cn.md#%E4%BA%A4%E4%BA%92%E5%BC%8F%E4%BB%BB%E5%8A%A1

额,出错的不是输入部分,是命令里面的 -q <(...) 中的这个括号,下面的这个更明确一点的命令同样会报 sh: 1: Syntax error: "(" unexpected

[vim-grep-word-code-files-clean]
command=vim -u NONE -q <(rg -n --no-heading --color never "anything" "." -tc -tcpp -tpy -tvim -tgo -tlua)
cwd=.
errorformat=%f:%l:%m
output=terminal

但是等价的命令

vim -u NONE -q <(rg -n --no-heading --color never "anything" "." -tc -tcpp -tpy -tvim -tgo -tlua)

直接在terminal中就可以正确执行。

cstsunfu commented 2 years ago

这个链接可能可以帮助解释这个问题 https://unix.stackexchange.com/questions/45781/shell-script-fails-syntax-error-unexpected

cstsunfu commented 2 years ago

@skywind3000 hi, 大佬,我发现这个问题应该是 python 的 os.system(command)命令默认调用的是/bin/sh, 但是我们一般用的都是bash、zsh等,使用 subprocess.call(['bash', '-c', command])显式使用bash就可以正确运行 image

但是我不知道这么修改之后会不会影响这个插件的其他逻辑,比如这样显式调用在windows中是否可行?所以没办法提交PR,还请大佬有空帮忙看一下

cstsunfu commented 2 years ago

直接在command中加 bash -c也可以,不需要修改了。

skywind3000 commented 2 years ago

试试这个

let g:asyncrun_shell = 'bash'
let g:asyncrun_shellflag = '-c'