我想知道是否可以在命令之前将参数传递给自定义命令?
假设我有自定义命令ping
,并且我想在命令之前传递 IP 地址:
相反ping 1.1.1.1
是1.1.1.1 ping
?
提前致谢
答案1
这适用于以下示例ping
:
echo 1.1.1.1 | xargs ping
命令前的参数
答案2
这有点麻烦,但似乎大部分有效:
cmd_handler() {
eval "cmd_words=($BASH_COMMAND)"
last_word="${cmd_words[@]: -1:1}"
if [ "$last_word" = gnip ]
then
argcm1=$((${#cmd_words[@]}-1))
ping "${cmd_words[@]:0:$argcm1}"
return 1
fi
}
shopt -s extdebug
trap cmd_handler debug
显然,前十行定义了一个名为 的函数cmd_handler
。该trap cmd_handler debug
命令指定 bash 应cmd_handler
为您键入的每个命令调用。您键入的命令(例如 )1.1.1.1 ping
可供$BASH_COMMAND
变量中的函数使用。这只是一个标量字符串,因此我们将cmd_words=($BASH_COMMAND)
其拆分为单词。这会导致假设的命令
ls -l This is "Super User".
分成六个字:
ls
-l
This
is
"Super
, 和User".
所以我们用来eval
让 shell 解释引号。该构造产生${array_name[@]:offset:length}
length
以 开头的数组成员。一个${array_name[offset]}
offset
of -1 指的是最后一个元素;因此,顾名思义,它的计算结果是命令的最后一个单词。包含一个空格,这样它看起来就不像您所说的那样。如果这是您的自定义命令的名称(我将其表示为用于测试目的),请计算参数计数减 1 ( ) 并使用除最后一个之外的所有单词作为参数执行。 告诉 shell 不要尝试通过正常解析来处理此命令。…:-…
gnip
argcm1
ping
return 1
我发现了一些故障和一些解决方法:
- 显然,这不能处理
1.1.1.1 gnip -n 4 -w 500
。- 它会处理
1.1.1.1 -n 4 -w 500 gnip
。 - 您可以修改
cmd_handler
以检查命令行中的每个单词以查找自定义命令的名称。
- 它会处理
1.1.1.1 gnip > ping.out
行不通,因为cmd_handler
会看到ping.out
最后一句话。您可以使用(1.1.1.1 gnip) > ping.out
或者{ 1.1.1.1 gnip;} > ping.out
第一个将在子 shell 中运行命令;第二个不会。请记住,第二种形式需要在 后面有一个空格
{
,在 之前有一个分号 (;
)}
。1.1.1.1 gnip | some other command
行不通,我不明白为什么行不通。如果您希望命令在主 shell 中运行,您可以通过说 来解决此问题,或者使用其他形式 来解决此问题。(1.1.1.1 gnip) > >(some other command)
{ 1.1.1.1 gnip;} > >(some other command)
可能还有其他我还没有发现的陷阱。