假设我有两个脚本,script1.sh
并且script2.sh
.我想知道是否有一种方法可以创建一个文件系统接口,例如,我可以vim file
运行我的系统script1.sh
并在编辑器中获得脚本的输出。然后,当我写入文件时,系统会将修改后的文本作为管道输入发送到script2.sh
.
这可能吗?我研究过使用“inotify”,它可以在文件更改时运行我想要的脚本。但我还没有弄清楚如何执行第一部分,其中打开文件本身只是从某些脚本获取标准输出。
答案1
这项工作的工具是保险丝(FUSE 代表 USerspace 中的文件系统)。 FUSE 允许用户程序实现文件系统。如果您在 FUSE 文件系统上运行vim file
,file
那么提供文件系统的程序将在 Vim 读取文件时生成文件内容,并在 Vim 保存文件时存储(或不存储!)内容。
FUSE 比你要求的更复杂。提供文件系统的程序不仅管理文件的内容,还管理目录结构、权限等。它还需要管理每个文件的一块块的读写,除非你使文件不可查找(这会限制程序)这可以对他们起作用)。
我不知道有任何基于 FUSE 构建的项目只提供一个操作文件内容的接口,同时提供经典的目录结构。您可以从一些示例文件系统中复制代码。
答案2
这个 shell 函数将执行您所要求的操作:
vim() { bash script1.sh <"$1" >"$1.hide~"; /usr/bin/vim "$1.hide~"; bash script2.sh <"$1.hide~"; }
使用该函数如下:
vim file
将其分解为几部分:
bash script1.sh <"$1" >"$1.hide~"
$1
是您提供给脚本的第一个参数,它应该是文件名。它'script1.sh
在其标准输入上使用该文件运行,并将输出写入临时文件。/usr/bin/vim "$1.hide~"
vim
这在 的输出上运行实数script1.sh
。这假设
vim
您系统上的编辑器位于/usr/bin
.如果它位于其他地方,请适当调整函数定义。bash script2.sh <"$1.hide~"
这将编辑后的文件作为标准输入提供
script2.sh
。
要使此函数定义永久存在,请将其作为单独的行放在~/.bashrc
文件中。