将 find 函数别名化并与 sudo 一起使用

将 find 函数别名化并与 sudo 一起使用

我在创建别名时遇到问题,因此我可以find在“静默模式”下运行(没有所有Permission denied消息)。我的 bash 技能很差,所以我不知道如何解决这个问题

这是我的别名~/.bashrc

alias find='function _find(){find / -name "$1" 2>&1 | grep -v "Permission denied"}'

所以如果我运行source ~/.bashrc然后sudo find "Exercism",我得到的输出find: ‘Exercism’: No such file or directory

但运行find / -name "Exercism" 2>&1 | grep -v "Permission denied"会产生正确的结果。

我不确定我是否将参数正确或完全传递到别名find函数中。

答案1

将别名视为在解释之前用 shell 代码中的其他文本替换单词。

别名find定义为:

alias find='function _find(){find / -name "$1" 2>&1 | grep -v "Permission denied"}'

当您输入时

find

在提示符下,它被替换为:

function _find(){find / -name "$1" 2>&1 | grep -v "Permission denied"}

如果 shell 是zsh,则该代码将定义一个_find函数,其主体是find / -name "$1" 2>&1 | grep -v "Permission denied"。在包括 在内的其他 shell 中bash,您会收到语法错误,因为function f()不是正确的变量声明语法,或者(如 inbashyash)因为这{find...将被视为简单命令,bash并且yash恰好是唯一不支持简单命令的 shell作为函数体。

在这里,您想要定义一个函数,而不是别名,并且由于该函数将具有与find命令不同的 API,因此您需要将其称为我的另一个名称,例如:

myfind() {
  find / -name "$@" 2>&1 | grep -v "Permission denied"
}

无论如何,无论是别名还是函数,因为两者都是 shell 的内部功能,您将无法从sudo.为了sudo能够调用它,您必须将其设置为像脚本一样的真正命令:

#! /bin/sh -
find / -name "$@" 2>&1 | grep -v "Permission denied"

您需要使该脚本可执行并将其存储在sudossecure_path如果已定义的目录中。

答案2

alias find='function _find() { find / -name "$1" 2>&1 | grep -v ": Permission denied$"; } ; _find'

您的别名定义了一个函数。你希望它定义一个函数并且叫它

相关内容