为什么 ack over ssh 不起作用?

Why does ack over ssh not work?

我有一个简单的 bash 脚本可以通过 ssh 删除远程服务器上的一些文件夹。它基本上是这样做的:

THE_HOST=12.34.56.78
ssh me@$THE_HOST "rm /the/file/path/thefile.zip"

这非常有效。在执行此操作之前,我经常使用 ack 在文件夹中的文件内容中搜索字符串:

ack thestring /the/folder/path/

当我通过 ssh 进入服务器并 运行 它时,它工作得很好,但是当我在一个命令中使用它时,它不起作用:

ssh me@$THE_HOST "ack thestring /the/folder/path/"

这似乎永远冻结或 运行:我没有得到任何输出,命令永远不会结束。有人知道为什么这对 ack 不起作用吗?

可能是 ack 在终端中 运行 时表现不同。尝试使用 -t 参数

ssh -t me@$THE_HOST "ack thestring /the/folder/path/"

当 ack 检测到 stdin 不是终端(tty 设备)时,它将尝试从 stdin 而不是给定的 file/folder 读取要搜索的文本。这就是当您 运行 通过 ssh 时发生的情况,stdin 将连接到 ssh 连接,这看起来不像要确认的终端(tty)。

ssh 的 -t 参数改为分配一个 tty 并将其连接到您 运行 程序的 stdin/out,然后 ack 将认为它 运行s 在一个终端,而是使用 file/folder 参数进行搜索。 参见 http://github.com/beyondgrep/ack2/issues/659