如何让Vim变量可被Bash识别?及grep非递归查找问题
哈喽!我来帮你逐个解决这两个问题:
要让Vim里的变量能被Bash读取,主要分几种场景,我给你整理几个实用的方法:
在Vim中直接调用Bash命令时传递变量
如果你是在Vim里用:!执行Bash命令,直接用%{变量名}就能把Vim变量展开给Bash。比如你在Vim里定义了let vim_var = "my_project",然后执行:!echo %{vim_var},Bash就能拿到这个值。
要是变量里有空格或者特殊字符,记得用shellescape()转义,避免出错::!echo %{shellescape(vim_var)}。把Vim变量设为环境变量给Bash子进程
Vim里可以直接设置环境变量,格式是let $BASH_VAR = vim_var,这样后续启动的Bash子进程就能通过$BASH_VAR读取到这个值。比如:let my_vim_var = "hello_from_vim" let $MY_ENV_VAR = my_vim_var :!echo $MY_ENV_VAR # 这时Bash就能输出hello_from_vim从Bash启动Vim时传递变量(反向场景)
如果你是先在Bash里定义了变量,想让Vim读取,直接把Bash变量设为环境变量就行:export BASH_VAR="hello_from_bash" vim然后在Vim里用
$BASH_VAR或者getenv('BASH_VAR')就能获取到这个值。
先帮你分析下之前的问题:你执行grep "mynamefolder" /vol/Homefs/时,GNU grep默认会递归遍历这个目录下的所有文件和子目录,但你加了-d skip后,grep直接跳过了整个目录(因为你传的是目录路径),根本没去搜索里面的文件,所以才会输出nope。
这里给你几个靠谱的解决方案:
方法1:用通配符指定目录下的所有文件(简单直接)
直接用*匹配目录下的所有文件和子目录,再配合-d skip跳过子目录,只搜索文件:
grep -d skip "myfoldername" /vol/Homefs/*
这样/vol/Homefs/*会展开成目录下的所有条目,-d skip会让grep遇到子目录时直接跳过,只处理普通文件。
方法2:用find命令(更稳妥,适合文件较多的场景)
用find精准定位到当前目录的普通文件,再交给grep搜索,完全不会碰子目录:
find /vol/Homefs/ -maxdepth 1 -type f -exec grep "myfoldername" {} +
-maxdepth 1:限制只搜索当前目录,不进入子目录-type f:只找普通文件,排除目录、链接等-exec grep ... {} +:把找到的文件批量传给grep搜索,效率更高
方法3:用GNU grep的--no-recursion选项(GNU专属)
如果你用的是GNU grep(大部分Linux系统默认都是),可以直接加--no-recursion让grep遍历目录下的文件但不递归子目录:
grep --no-recursion "myfoldername" /vol/Homefs/
这个方法最简洁,但要注意BSD grep(比如macOS默认的)没有这个选项,这时候方法1或2更通用。
内容的提问来源于stack exchange,提问作者spaing

