作为 find 函数的输出给出的文件的尾部如何?

ben*_*ssa 4 shell tail

我是 Unix 环境中的新手。我想用函数监视集群上的计算输出。我已经尝试了这个函数,我把它放在我的 .bashrc 文件中的别名部分下:

function tj(){ 
    tail -100f $(find . -type f -name "*.o$1")
}
Run Code Online (Sandbox Code Playgroud)

进而

tj 1234
Run Code Online (Sandbox Code Playgroud)

查看文件中的内容,dm.o1234但我没有得到我想要的任何东西,实际上什么都没有(只有>)。

你知道错误在哪里吗?

Sté*_*las 5

它不知道您的问题的确切来源是什么,但您的代码在此处处于未指定的领域。

  • function tj()不是标准的函数定义语法,它既不是 Bourne/POSIX 语法(使用tj())也不是 Korn 语法(使用function tjwithout ())。一些 shell(bash、zsh、pdksh)确实支持它主要是偶然的。
  • tail -100fPOSIX 未指定。POSIX 语法是tail -f -n 100
  • POSIXtail最多接受一个参数,如果传递多个参数,则行为是未指定的。像 GNU 这样的一些实现tail能够并行观察多个文件,但许多其他实现则不能。您可以尝试安装专为此设计的类似 tail 的命令multitail
  • $(find...)调用 split+glob 运算符,因此使用默认值$IFS,如果任何文件路径包含空格、制表符、换行符或通配符,则该操作将无法正常工作。如果find没有返回文件,它也会以tail标准输入结束。

在这里,您可以使用zsh并将命令定义为

tj() multitail ./**/*.o$1(.)
Run Code Online (Sandbox Code Playgroud)

如果没有匹配的文件(而不是tailing stdin),它将报告错误。另请注意,与 相反find,它为您提供一个排序的文件列表并跳过隐藏文件或隐藏目录中的文件(D如果需要,请添加glob 限定符)。


现在,如果按照您的编辑,你看>,当你运行tj的时候>是默认的次提示符($PS2),它看起来更有可能的是,你必须也为定义的别名tj(该别名可能定义的定义tj函数或其他方面会导致tj函数定义错误)。

例如,如果你运行了,你会看到这样的事情:

alias tj='for sure'
Run Code Online (Sandbox Code Playgroud)

(一个未终止的for循环),或任何非自包含的代码,shell 会发出辅助提示让您完成它。

您可以unalias tj取消定义该别名(~/.bashrc如果它在那里,则从您的定义中删除它的定义,以便下次运行时它不会回来bash)。

当然,也总是有可能*.o1234找到的唯一文件只包含>.