为什么通过ssh使用ack无法正常工作?

3

我有一个简单的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不起作用吗?


1
你说的“它不工作”是什么意思?你没有收到任何输出,还是收到了错误信息? - kvantour
1
当在终端中运行时,ack 的行为可能会有所不同。请尝试使用 ssh -t me@$THE_HOST "ack thestring /the/folder/path/"` 命令。 - nos
@kvantour - 忘记补充了。我已经添加到问题中:它似乎会冻结或永远运行:我没有输出,命令从未结束。 - kramer65
@nos - 是的,就是这样,谢谢!如果您将您的评论作为答案添加,我可以接受它。 - kramer65
1
很想知道为什么会出现这种情况。我搜索了一下,但是找不到任何原因说明它为何无法工作。 - kvantour
只是随便提一下:如果您尝试在ansible(即席)命令中使用ack,它将无法与“shell”模块一起使用,但可以与“raw”模块一起使用。 - MacMartin
1个回答

3

在终端运行时,ack命令的行为可能会有所不同。尝试使用-t参数。

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

当ack检测到stdin不是终端设备(tty设备)时,它将尝试从stdin中读取要搜索的文本,而不是给定的文件/文件夹。当您通过ssh运行它时,stdin将连接到ssh连接,这看起来不像终端(tty)。
ssh的-t参数分配一个tty并将其连接到要运行的程序的stdin/out,ack将认为它在终端中运行,并使用文件/文件夹参数进行搜索。 参见http://github.com/beyondgrep/ack2/issues/659

1
也许是因为ack在Perl中使用Term模块来输出ANSI颜色序列?也许你可以尝试ANSI_COLORS_DISABLED=1 ack thestring /the/folder/path/ - Gerrit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接