在 Bash 中运行 Heredocs 的 Fish 缩写

问题描述 投票:0回答:1

我正在尝试写一个缩写来执行以下操作:

如果整个缓冲区中某处有

<<
,它将用
bash -c "<the-buffer>"

将其括起来

所以,如果我跑步

tee $HOME/Desktop/test << END
I am testing!
END

它将运行以下命令。

bash -c "tee $HOME/Desktop/test << END
I am testing!
END"

我想出的代码是:

function run_in_bash
    # Run the command in bash
    bash -c "(commandline --current-buffer)"
end

abbr --add run_in_bash_abbr --regex '.*<<.*' --function run_in_bash

但是现在当我跑步时:

tee $HOME/Desktop/test << END
I am testing!
END

它说

fish: Expected a string, but found a redirection
。我在这里能做什么?

fish
1个回答
0
投票

这里存在一些误解,不幸的是其中之一意味着这种方法从根本上是行不通的。

首先是 abbr 函数需要 打印替换文本,而不是运行它。

所以你会做

echo bash -c \'"$(commandline --current-buffer)"\'
,而不是直接
bash -c "..."
。它还必须是
$()
,以便替换发生在那里,并在插入命令行的情况下打印它。您还必须转义缓冲区文本,以便将其用作单个参数 -
commandline --current-buffer | string escape

第二个原因是,缩写是由最后一个标记触发的,而正则表达式仅与该一个标记相匹配,这也是导致这种方法无法实现的原因。

这意味着一旦您输入

<< 
,缩写就会运行,并用它打印的内容替换
<< 
并且仅替换
<< 

(或者至少会,但由于

<<
不是 Fish 中的有效标记,因此它会单独在
<
上运行缩写,因此您实际上无法将
<<
与缩写匹配)

© www.soinside.com 2019 - 2024. All rights reserved.