相关疑难解决方法(0)

使用“-o errtrace”(即设置-E)捕获命令替换中的错误

根据这个参考手册

-E(还有 -o errtrace)

如果设置,则 ERR 上的任何陷阱都由 shell 函数、命令替换和在子 shell 环境中执行的命令继承。在这种情况下,ERR 陷阱通常不会被继承。

但是,我必须错误地解​​释它,因为以下不起作用:

#!/usr/bin/env bash
# -*- bash -*-

set -e -o pipefail -o errtrace -o functrace

function boom {
  echo "err status: $?"
  exit $?
}
trap boom ERR


echo $( made up name )
echo "  ! should not be reached ! "
Run Code Online (Sandbox Code Playgroud)

我已经知道简单的赋值,my_var=$(made_up_name), 将退出脚本set -e(即 errexit)。

-E/-o errtrace应该的工作方式类似于上面的代码?或者,最有可能的是,我误读了它?

bash command-substitution

15
推荐指数
2
解决办法
7680
查看次数

如何将存储在变量中的参数传递给 WGET

我正在编写一个广泛使用 wget 的 bash 脚本。为了在一个地方定义所有通用参数,我将它们存储在变量中。这是一段代码:

useragent='--user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"'
cookies_file="/tmp/wget-cookies.txt"
save_cookies_cmd="--save-cookies $cookies_file --keep-session-cookies"
load_cookies_cmd="--load-cookies $cookies_file --keep-session-cookies"

function mywget {
    log "#!!!!!!!!!# WGET #!!!!!!!!!# wget $quiet $useragent $load_cookies_cmd $@"  
    wget $useragent $load_cookies_cmd "$@"
}
Run Code Online (Sandbox Code Playgroud)

可悲的是不起作用。不知何故,我缺少将参数存储在变量 $useragent、$save_cookies_cmd、$load_cookies_cmd 和 caling wget 将这些变量作为参数传递的正确方法。

我想要这样的结果命令行:

wget --user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" --load-cookies /tmp/wget-cookies.txt --keep-session-cookies http://mysite.local/myfile.php
Run Code Online (Sandbox Code Playgroud)

编辑:我的最终解决方案:

最后,我的脚本正确地使用了这个:

useragent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"
useragent_cmd="--user-agent=$useragent"
cookies_file="/tmp/wget-cookies.txt"
save_cookies_cmd="--save-cookies $cookies_file --keep-session-cookies"
load_cookies_cmd="--load-cookies $cookies_file --keep-session-cookies"

function mywget {
    log …
Run Code Online (Sandbox Code Playgroud)

bash wget variable-substitution

10
推荐指数
1
解决办法
9179
查看次数

如何一次定义类似的bash函数

我有这些功能~/.bashrc

function guard() {
    if [ -e 'Gemfile' ]; then
    bundle exec guard "$@"
    else
    command guard "$@"
    fi
}
function rspec() {
    if [ -e 'Gemfile' ]; then
    bundle exec rspec "$@"
    else
    command rspec "$@"
    fi
}
function rake() {
    if [ -e 'Gemfile' ]; then
        bundle exec rake "$@"
    else
        command rake "$@"
    fi
}
Run Code Online (Sandbox Code Playgroud)

如您所见,这些功能非常相似。我想一次定义这 3 个函数。有没有办法做到?

环境

bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Run Code Online (Sandbox Code Playgroud)

bash

10
推荐指数
2
解决办法
746
查看次数