回显命令,然后运行它-管道命令失败?

彩虹洒

我有一个环境设置脚本,我想在其中提醒用户我正在执行哪些命令(即正在安装的命令)。使用set -x会使输出过于混乱,因此我有一个successfully重要的命令被调用的函数

#!/bin/bash
trap "exit 1" TERM
export TOP_PID=$$

real_exit() {
  echo -e "Goodbye :'("
  kill -s TERM $TOP_PID
}

successfully() {
  echo -e "$*"
  $* || (echo -e "\nFailed. Check output and then retry, please." 1>&2 && real_exit)
}

例如,我可以调用successfully brew update脚本,如果脚本失败,则用户知道该脚本执行失败的命令,脚本停止。

但是,当我尝试安装Ruby / RVM时,我的脚本失败了

successfully "curl -L https://get.rvm.io | bash -s stable --ruby"

当我从命令行调用curl命令时,它可以正常工作,但是当脚本出现错误时,它会失败:

curl -L https://get.rvm.io | bash -s stable --ruby
curl: option --ruby: is unknown
curl: try 'curl --help' or 'curl --manual' for more information
控制台盒

您将需要使用eval,但不建议这样做。

successfully() {
    echo -e "$1"
    eval "$1" || (echo -e "\nFailed. Check output and then retry, please." 1>&2 && real_exit)
}

同时发送SIGHUP而不是SIGTERM:

  kill -s SIGHUP "$TOP_PID"

您也可以使用以下安全变体:

successfully() {
    local __A=() __I
    for (( __I = 1; __I <= $#; ++__I )); do
        if [[ "${!__I}" == '|' ]]; then
            __A+=('|')
        else
            __A+=("\"\$$__I\"")
        fi
    done
    echo "$@"
    eval "${__A[@]}" || (echo -e "\nFailed. Check output and then retry, please." 1>&2 && real_exit)
}

例子:

successfully curl -L https://get.rvm.io \| bash -s stable --ruby  ## You just have to quote pipe.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重击,检查命令返回,然后回显它

来自分类Dev

管道命令中的数组失败

来自分类Dev

为单个管道命令设置管道失败

来自分类Dev

命令失败时尽早退出管道

来自分类Dev

如果命令失败,bash停止管道

来自分类Dev

失败后如何继续级联管道命令

来自分类Dev

在运行之前回显别名命令

来自分类Dev

Azure DevOps发布管道在kubectl命令上失败

来自分类Dev

Perl 的命令管道用完在 sed 预置路径时失败

来自分类Dev

从while循环管道到命令,但是如果管道命令失败,则执行另一个命令

来自分类Dev

撤消回显命令

来自分类Dev

通过管道或回显密码进入RAR命令?

来自分类Dev

通过管道或回显密码进入RAR命令?

来自分类Dev

为什么在运行命令时终端回显按键?

来自分类Dev

为什么在运行命令时终端回显按键?

来自分类Dev

运行存储在变量中的命令以回显文件

来自分类Dev

ssh:在远程运行命令时如何关闭回显

来自分类Dev

Windows 命令提示符 (cmd.exe) 中失败命令的管道输出

来自分类Dev

如果AWS数据管道中的emr活动失败,则运行shell命令

来自分类Dev

Powershell命令执行回显?

来自分类Dev

Linux命令:为什么重定向运算符-| 即管道在这里失败?

来自分类Dev

如果后接管道,Linux tee命令有时会失败

来自分类Dev

由于package.json具有Windows命令,因此Gitlab管道失败

来自分类Dev

AzureDevops管道使用terraform和local-exec az命令失败,服务主体

来自分类Dev

由于package.json具有Windows命令,因此Gitlab管道失败

来自分类Dev

为什么将管道命令传送到telnet会导致间歇性的连接失败?

来自分类Dev

Linux命令:为什么重定向运算符-| 即管道在这里失败?

来自分类Dev

如果命令失败,终止管道其余部分的最简洁方法是什么?

来自分类Dev

如果后接管道,Linux tee命令有时会失败

Related 相关文章

  1. 1

    重击,检查命令返回,然后回显它

  2. 2

    管道命令中的数组失败

  3. 3

    为单个管道命令设置管道失败

  4. 4

    命令失败时尽早退出管道

  5. 5

    如果命令失败,bash停止管道

  6. 6

    失败后如何继续级联管道命令

  7. 7

    在运行之前回显别名命令

  8. 8

    Azure DevOps发布管道在kubectl命令上失败

  9. 9

    Perl 的命令管道用完在 sed 预置路径时失败

  10. 10

    从while循环管道到命令,但是如果管道命令失败,则执行另一个命令

  11. 11

    撤消回显命令

  12. 12

    通过管道或回显密码进入RAR命令?

  13. 13

    通过管道或回显密码进入RAR命令?

  14. 14

    为什么在运行命令时终端回显按键?

  15. 15

    为什么在运行命令时终端回显按键?

  16. 16

    运行存储在变量中的命令以回显文件

  17. 17

    ssh:在远程运行命令时如何关闭回显

  18. 18

    Windows 命令提示符 (cmd.exe) 中失败命令的管道输出

  19. 19

    如果AWS数据管道中的emr活动失败,则运行shell命令

  20. 20

    Powershell命令执行回显?

  21. 21

    Linux命令:为什么重定向运算符-| 即管道在这里失败?

  22. 22

    如果后接管道,Linux tee命令有时会失败

  23. 23

    由于package.json具有Windows命令,因此Gitlab管道失败

  24. 24

    AzureDevops管道使用terraform和local-exec az命令失败,服务主体

  25. 25

    由于package.json具有Windows命令,因此Gitlab管道失败

  26. 26

    为什么将管道命令传送到telnet会导致间歇性的连接失败?

  27. 27

    Linux命令:为什么重定向运算符-| 即管道在这里失败?

  28. 28

    如果命令失败,终止管道其余部分的最简洁方法是什么?

  29. 29

    如果后接管道,Linux tee命令有时会失败

热门标签

归档