我试过类似的东西:
alias fdi 'find . -type d -iname "*\!^*"'
但这只会查找作为参数传递的确切名称。
fdi abc
只会输出:
./d/abc
不是这个:
./d/greabcyup
我不只是在寻找确切的名字。它还应该显示./d/greabcyup
更新:我做了
echo $0
tcsh
这是 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。
别名"*\!^*"
中的匹配模式未按预期解释。字符序列\!^*
是有效的 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 "*\!{^}*"'