【问题标题】:passing multiple bash commands to a function将多个 bash 命令传递给一个函数
【发布时间】:2023-01-11 04:24:11
【问题描述】:

我想传入多个命令在单个函数调用中使用 && 运算符。每个命令都可以有不同数量的参数,所以我使用 $@ 来捕获所有参数。使用单个命令,下面的函数可以正常工作。

function try_log () {
     $@ \
         && echo "PASS!"
         || echo "FAIL!"
}

$ try_log touch foo bar
  PASS!
$ try_log rm foo bar
  PASS!
$ try_log rm foo bar
rm: cannot remove 'foo': No such file or directory
rm: cannot remove 'bar': No such file or directory
  FAIL!

我现在想在输入命令上添加对 && 运算符的支持。目的是运行整个命令,然后在最后显示 PASS 或 FAIL。我尝试了以下但没有成功。

try_log ls && ls # runs the send ls after the first completes
foo bar
  PASS!
foo bar

try_log 'ls && ls'
ls: cannot access '&&': No such file or directory
ls: cannot access 'ls': No such file or directory
  FAIL!

$ try_log `ls && ls`
foo: command not found
  FAIL!


【问题讨论】:

    标签: bash


    【解决方案1】:

    首先,您的功能无法正常工作。您需要引用 $@ 来处理任意参数,您应该只使用常规的 if 语句,而不是尝试使用 &&|| 来模拟条件表达式。

    try_log () {
         if "$@"; then echo "$PASS!"; else echo "FAIL!"; fi
    }
    

    问题是这只能处理简单的命令,由命令的名称及其参数组成。它不处理管道、[[if 等复合命令或a && b 等命令列表。唯一真正的解决方案是将命令作为单个字符串传递,让try_log使用eval来解析和执行它。

    try_log () {
         if eval "$1"; then echo "$PASS!"; else echo "FAIL!"; fi
    }
    
    try_log "ls && ls"
    

    (这不是 eval 的“邪恶”使用,因为您使用它的目的正是它:执行任意代码。只需确保,而不是不受信任的用户,正在提供任意代码。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 2023-04-05
      相关资源
      最近更新 更多