使用进程替换来欺骗需要文件的程序,并将特定的扩展名作为参数?

sda*_*aau 9 bash filenames process-substitution

这是我的用例:命令行实用程序melt可以接受带有.melt命令行扩展名的文件名,然后打开它;例如,这是一个正确的test_p.melt文件:

colour:blue
out=24

colour:red
out=48
Run Code Online (Sandbox Code Playgroud)

... 打开并播放melt test_p.melt.

现在,问题是.melt文件不支持注释,我希望他们支持(对于包含不可解析参数的任何行,包括那些带有 a 的参数,您都会收到错误消息#)。所以这是一个注释test_c.melt文件:

# master comment here

colour:blue  # this is blue!
out=24

colour:red
out=48
Run Code Online (Sandbox Code Playgroud)

melt直接打开它给出:

$ melt test_c.melt
Failed to load "# master comment here"
...
Run Code Online (Sandbox Code Playgroud)

...并且没有显示蓝屏。

所以我想 - 好吧,我无论如何都可以添加注释,然后使用 Bash 进程替换来过滤文件sed,然后简单地将其提供给melt应用程序。首先,尝试使用 进行测试cat,测试成功:

$ cat <(sed 's/#.*$//' test_c.melt)



colour:blue  
out=24

colour:red
out=48
Run Code Online (Sandbox Code Playgroud)

... 看起来挺好的; 但是,如果我尝试使用melt,它会看穿我的诡计:

$ melt <(sed 's/#.*$//' test_c.melt)
Failed to load "/dev/fd/62"
Failed to load "/dev/fd/62"
Run Code Online (Sandbox Code Playgroud)

基本上,melt 得到了为进程替换提供的管道 Bash 的文件名 - 但不幸的melt是,它argv[i]直接处理的是什么;如果是文件,则需要.melt在文件名中看到扩展名;如果没有 - 过程失败。

所以我的问题是:我怎么能使用进程替换——所以管道的文件名有一个特定的扩展名,在这种情况下.melt?基本上,作为替换的结果,我想要一个管道文件名/dev/fd/62.melt,我认为它会通过。

注意:当然,我总是可以这样做:

sed 's/#.*$//' test_c.melt > test_c_temp.melt
melt test_c_temp.melt
Run Code Online (Sandbox Code Playgroud)

...但首先,这里有两个命令 - 我想要一个单线管道;另一方面,它打开了我考虑之后删除临时文件的另一个问题,我不喜欢。

这是否可以使用 Bash 进程替换 - 或者以某种方式使用标准 Linux 工具?

Gil*_*il' 3

一种可能性是指向melt显示文件修改副本的文件系统。FUSE是一种构建文件系统驱动程序的通用方法,由普通程序实现,不需要任何特权。周围有许多 FUSE 文件系统,其中一个很有可能可以帮助您。这个想法是提供一个挂载点,读取.melt文件时会读取 \xe2\x80\x9creal\xe2\x80\x9d 文件,但注释会被过滤掉。

\n\n

ScriptFS看起来很有前途(但我从未使用过它)。像这样的东西应该有效:

\n\n
mkdir ~/uncommented-melt\nscriptfs -p "$HOME/bin/uncomment-melt;&*.melt" ~/work ~/uncommented-melt\n
Run Code Online (Sandbox Code Playgroud)\n\n

包含您的文件的~/work树的根在哪里.melt~/bin/uncomment-melt

\n\n
#!/bin/sh\nsed \'s/#.*$//\' "$1"\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,如果您有带有注释的文件~/work/test_c.melt,则可以运行melt ~/uncommented-melt/test_c.melt.

\n\n

其他可能有用的 FUSE 文件系统:

\n\n
    \n
  • Execfuse \xe2\x80\x94\xc2\xa0 可让您使用 shell 脚本构建简单的 FUSE 驱动程序
  • \n
  • AVFS或其他透明解压缩文件的 FUSE 文件系统:将注释剥离定义为解压缩规则。
  • \n
\n