Bash 命令:是否可以在自定义命令(函数)之前传递参数,或者只能在以下命令之后传递参数:

Bash 命令:是否可以在自定义命令(函数)之前传递参数,或者只能在以下命令之后传递参数:

我想知道是否可以在命令之前将参数传递给自定义命令?

假设我有自定义命令ping,并且我想在命令之前传递 IP 地址:

相反ping 1.1.1.11.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]}offsetof -1 指的是最后一个元素;因此,顾名思义,它的计算结果是命令的最后一个单词。包含一个空格,这样它看起来就不像您所说的那样。如果这是您的自定义命令的名称(我将其表示为用于测试目的),请计算参数计数减 1 ( ) 并使用除最后一个之外的所有单词作为参数执行。  告诉 shell 不要尝试通过正常解析来处理此命令。:-gnipargcm1pingreturn 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)

可能还有其他我还没有发现的陷阱。

相关内容