3

我试过类似的东西:

alias fdi 'find . -type d -iname "*\!^*"' 

但这只会查找作为参数传递的确切名称。

fdi abc只会输出:

./d/abc

不是这个:

./d/greabcyup

我不只是在寻找确切的名字。它还应该显示./d/greabcyup

更新:我做了

echo $0

tcsh

4

2 回答 2

2

这是 c-shell 还是 tcsh?

简而言之, 我用orielly lunix 进行了dbl-checked ,!^这意味着它是当前命令行中的第一个单词,所以我不认为它在做你想做的事。echo abc def !^您可以使用cmd-line自己检查该理论。(我手边没有 csh)。

但很明显,当您创建别名时,它并没有获得嵌入在别名中的第一个单词 (alias) 或别名的第一个单词 (find)。这可能是关于 csh 的评估顺序。

一般来说,大多数 shell(不仅仅是 csh)中的任何别名都不能接受参数。它将在最后附加调用中包含的任何内容。因此,您的别名会扩展, abc 参数为

find . -type d -iname abc

你得到的结果,支持这一点。(通过将顶部的 hash-bang 行更改为 ,打开 csh 调试,您可能会看到一些有用的信息#!/bin/csh -vx

这就是为什么其他外壳具有功能的原因,

 function fdi() {
     find . -type d -iname "$@"
 }

如果您因为政策原因不能使用其他 shell(bash、ksh、zsh 都是强大的编程语言),并且您将定期使用 csh,请务必拿起一份《Unix C shell 现场指南》 ,盖尔和保罗安德森。一本写得非常出色的书。

IHTH。

于 2012-11-02T02:29:31.560 回答
1

别名"*\!^*"中的匹配模式未按预期解释。字符序列\!^*是有效的 shell 历史替换。换句话说,shell 使用最后一个星号作为 shell 历史替换的一部分,而不是将它传递给“find”命令。当您运行“fdi abc”时,正在执行的是

find . -type d -iname "*abc"

最后一个 * 不见了。您可以通过运行“fdi abcyup”来确认它应该返回

./d/greabcyup

您可以通过在别名定义中添加另一个星号来修复它

alias fdi 'find . -type d -iname "*\!^**"' 

问题在于,如果您为别名提供多个参数,则历史替换将消耗所有参数。如果您正在寻找名称中带有空格的目录,这可能就是您想要的。但更正确的做法是将历史替换与星号隔离,如下所示:

alias fdi 'find . -type d -iname "*\!{^}*"'
于 2018-04-07T06:28:07.913 回答