如何捕获“*”作为 bash 函数的参数并在比较中使用
How to capture "*" as argument to bash function and use in a comparison
我想要 bash 运行 rm -i *
如果我输入 rm *
否则 运行 常规 rm
。重要的是,我不想每次使用 rm part*
等通配符时都 运行 rm -i
。这是我所能想到的:
rm ()
{
if [ "" == "*" ]; then
rm -i *
else
rm
fi
}
但我知道这会失败。我知道我想要的比较是^*$
,但我不知道如何实现它。
如果没有 shell.
的合作,根本不可能 知道您的命令是否使用通配符调用
当您调用 rm *
(与任何其他命令一样)时,*
在调用 之前被替换为文件名列表 。因此,当在命令内部时,为它提供通配符的信息不再存在:</code>、<code>
等已被通配符扩展到的名称列表替换。
也就是说,既然我们是shell函数,其实我们shell的配合是可以的:
rm() {
local cmd
read -r _ cmd < <(HISTTIMEFORMAT=''; history 1)
if [[ $cmd = "rm *" ]]; then
command rm -i "$@"
else
command rm "$@"
fi
}
这是如何工作的?
history 1
returns shell 历史记录中的最新命令(前面有数字)。
read -r _ cmd
将该数字读入变量 _
,并将命令行的其余部分读入变量 cmd
[[ $cmd = "rm *" ]]
将命令与该精确字符串进行比较
command rm ...
运行 external rm
命令,避免再次递归回到我们的函数。
既然不能知道有没有通配符,为什么不查一下参数个数呢?
例如:
#!/bin/bash
rm () {
if [ "$#" -gt 1 ]; then
echo command rm -i "$@"
else
echo command rm "$@"
fi
}
rm a b c
rm a
我想要 bash 运行 rm -i *
如果我输入 rm *
否则 运行 常规 rm
。重要的是,我不想每次使用 rm part*
等通配符时都 运行 rm -i
。这是我所能想到的:
rm ()
{
if [ "" == "*" ]; then
rm -i *
else
rm
fi
}
但我知道这会失败。我知道我想要的比较是^*$
,但我不知道如何实现它。
如果没有 shell.
的合作,根本不可能 知道您的命令是否使用通配符调用当您调用 rm *
(与任何其他命令一样)时,*
在调用 之前被替换为文件名列表 。因此,当在命令内部时,为它提供通配符的信息不再存在:</code>、<code>
等已被通配符扩展到的名称列表替换。
也就是说,既然我们是shell函数,其实我们shell的配合是可以的:
rm() {
local cmd
read -r _ cmd < <(HISTTIMEFORMAT=''; history 1)
if [[ $cmd = "rm *" ]]; then
command rm -i "$@"
else
command rm "$@"
fi
}
这是如何工作的?
history 1
returns shell 历史记录中的最新命令(前面有数字)。read -r _ cmd
将该数字读入变量_
,并将命令行的其余部分读入变量cmd
[[ $cmd = "rm *" ]]
将命令与该精确字符串进行比较command rm ...
运行 externalrm
命令,避免再次递归回到我们的函数。
既然不能知道有没有通配符,为什么不查一下参数个数呢?
例如:
#!/bin/bash
rm () {
if [ "$#" -gt 1 ]; then
echo command rm -i "$@"
else
echo command rm "$@"
fi
}
rm a b c
rm a