我在创建别名时遇到问题,因此我可以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()
不是正确的变量声明语法,或者(如 inbash
或yash
)因为这{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"
您需要使该脚本可执行并将其存储在sudo
ssecure_path
如果已定义的目录中。
答案2
alias find='function _find() { find / -name "$1" 2>&1 | grep -v ": Permission denied$"; } ; _find'
您的别名定义了一个函数。你希望它定义一个函数并且叫它。