尝试在别名中使用“pwd”会产生意外结果

尝试在别名中使用“pwd”会产生意外结果

如果我想搜索系统中的文件,我使用以下命令:

sudo find `pwd` -name filename.ext

我想为像 这样的更简单的单词创建一个别名search,所以我使用了以下命令:

alias search "find `pwd` -name "

问题是该命令将该pwd部分转换为我现在所在的实际路径。当我只是输入alias以查看别名列表时,我看到:

search   find /path/to/my/homedir -name

我怎样才能避免这种情况?

答案1

使用单引号以避免定义时 shell 扩展

alias search='find `pwd` -name '

答案2

将命令修改为:

alias search="find . -name "

所以永远都会搜索仅在当前目录中,即当前工作目录

答案3

命令替换在 (t)csh (您似乎正在使用)中的双引号内展开,就像在类似 Bourne 的 shell 中一样。

所以在:

alias search "find `pwd` -name "

你实际上正在做类似的事情:

alias search 'find /some/dir -name '

运行/some/dir该命令时当前目录在哪里。alias

在这里,您想要:

alias search 'find $cwd:q -name'

$cwd自动设置tcsh$PWD在现代版本中也是如此,例如在 POSIX shell 中),因此您可以使用它来代替效率较低且可靠性较低的`pwd`.

我们使用单(强)引号,这样$cwd就不会在内部扩展。

$cwd:q是将变量的值作为一个参数传递,而不是让它进行拆分。

另请注意,上面后面不需要空格-name

如果您想使用pwd(例如,以便您获得当前工作目录的规范(无符号链接)路径,就像在某些实现中,例如不在环境中的pwdGNU 实现中一样),您可以使用:POSIXLY_CORRECT

alias search 'find "`pwd`" -name'

但如果当前目录的路径包含换行符,则这将不起作用。

请注意,您不能使用sudo search别名,因为别名仅在 (t)csh 中的命令位置展开。在 POSIX shell 中你可以这样做:

alias sudo='sudo '

告诉 shell 后面的单词sudo也应该进行别名扩展,但这个技巧在 (t)csh 中不起作用。

POSIX sh(或bash/ zsh/ ksh...)等效项为:

alias search='find "$PWD" -name'

答案4

alias一旦被调用就会被评估。调用别名时没有调用命令的选项。您必须编写一个 bash 函数,您可以在其中运行子命令,或者更好的是,使用. (在当前目录中搜索)而不是“pwd”。

相关内容