aba*_*ter 1 regex bash rm wildcard
rm -i *如果我输入,我想要bash运行rm *,否则运行常规rm.重要的是,我不想rm -i每次使用通配符时都运行rm part*.据我所知,这是:
rm ()
{
if [ "$1" == "*" ]; then
rm -i *
else
rm $1
fi
}
Run Code Online (Sandbox Code Playgroud)
但我知道这会失败.我知道我想要的比较是^*$,但我不知道如何实现它.
这是根本不可能知道你的命令没有与你的shell的合作通配符调用.
当您调用rm *(像任何其他命令一样)时,在调用之前将*其替换为文件名列表.因此,当命令中,它被赋予了通配符不再是信息存在:,,等已被替换,通配符扩展到名称的列表.$1$2
也就是说,由于我们是shell函数,我们shell的合作实际上是可用的:
rm() {
local cmd
read -r _ cmd < <(HISTTIMEFORMAT=''; history 1)
if [[ $cmd = "rm *" ]]; then
command rm -i "$@"
else
command rm "$@"
fi
}
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?
history 1 返回shell历史记录中的最新命令(前面有一个数字).read -r _ cmd将该数字读入变量_,其余命令行读入变量cmd[[ $cmd = "rm *" ]] 将命令与该精确字符串进行比较command rm ...运行外部 rm命令,避免再次递归回函数.