English 中文(简体)
标本或档案中的错误探测
原标题:error detection in options provided to bash script or from a file
  • 时间:2023-12-28 21:36:00
  •  标签:
  • bash

想象指挥线类似:

my-script -foo $(no-such-cmd)

<代码>(无此类编码)将造成错误,但我无法找到办法让文字了解这个问题。 似乎没有工作。 有办法?

This is part of a problem I came across when trying to process arguments from a file. I was reading a file line by line and trying to detect errors.

这里就是一个例子。 我在一份档案中以两条预设线标示。

function err_handler
{
    ehs=1
    echo "bad thing happened"
}

function fxn
{
    echo fxn "$@"
    return 0
}

function doit
{
    ehs=0
    trap err_handler ERR
    eval fxn "$@"
    eval_status=$?
    trap "" ERR

    echo ehs $ehs ev $eval_status
}

line= -x good 
doit $line

line= -x $(no-such-cmd) 
doit $line

产出:

> ./line.sh 
fxn -x good
ehs 0 ev 0
./line.sh: line 17: no-such-cmd: command not found
fxn -x
ehs 0 ev 0

notice how the error message shows up but the trap didn t trigger nor did the exit status reflect it.

================================================================================================================================================================================================================================================================ 回答以下一些问题: ================================================================================================================================================================================================================================================================

@Barmar - 扩展工作是在需要做事之前进行的,但因做事。 错误暴露出来。 我可以在我的实际法典中加入这一法典。

@user1934428 - Im想要从档案中一米阅读的转换中发现任何错误。 这一美元(未如此之四)只是显示难以赶走的一种方式。

@charles duffy - I m不试图将代码放在变数中,I m读转换成从档案中指挥。

@Willian Pursell——我没有掌握投入。 我需要依靠用户正确引用这些动力。

最佳回答

因此,从来就不用打上<条码>——foo美元(无此类)。 第一,任务变数,然后称为指挥。

if ! arg=$(no-such-cmd); then
   echo "no-such-cmd failed!"
   exit 2
fi
my-script -foo "$arg"

围绕<代码>eval和在<代码>$(.)之间的程序通信中, / subshell 和nershell之间保持不可持续和不可读。 无论如何,你必须用斜体来分享<代码>。 并且,你还必须进行从子壳到母壳之间的相互沟通,它们是单独的过程。 以下例子使用了信号。

此外,下面,我把指挥论点分开,并在不同的阶段执行指挥。 请注意,可变的任务等于最后执行指挥。 关于<代码>args=($(no- such-cmd)),最后执行指令为:no- such-cmd,在这种情况下,该转让有127个出境代码。 但是,args=($(no- such-cmd)),所执行的最后一项指令是true,在这种情况下,第一颗子轮将SIGUSR1送给家长,由其告知错误。

#!/bin/bash

err_handler() {
    # Just communicate to parent process that we failed.
    kill -s SIGUSR1 "$parent"
}

fxn() {
    echo fxn "$@"
}

doit_init() {
    trap err_handler ERR
    # just set variable err on SIGUSR1
    trap err=1 SIGUSR1
    # inherit ERR
    set -E
}

doit() {
    echo "+ fxn $*"
    err=0
    local args=()
    parent=$$
    eval "args=($*)"
    ret=$?
    if ((ret)); then
        echo "parsing args failed with $ret"
        return 1
    fi
    if ((err)); then
        echo "any command substitution while expanding arguments failed"
        return 1
    fi
    fxn "${args[@]}"
    ret=$?
    if ((ret)); then
        echo "Calling fxn failed $ret"
        return 1
    fi
}

doit_init

line= -x good 
doit "$line"

# shellcheck disable=SC2016
line= -x $(no-such-cmd) 
doit "$line"

# shellcheck disable=SC2016
line= -x $(no-such-cmd) $(true) 
doit "$line"

文字执行导致:

$ ./script.sh 
+ fxn -x good
fxn -x good
+ fxn -x $(no-such-cmd)
./script.sh: line 30: no-such-cmd: command not found
parsing args failed with 127
+ fxn -x $(no-such-cmd) $(true)
./script.sh: line 30: no-such-cmd: command not found
any command substitution while expanding arguments failed

检查你的手稿。 不要在扼杀中储存指挥论点——更喜欢布沙阵。 引述指挥替代。

问题回答

I think you are over-complicating this. Consider:

$ cat my-script 
#!/bin/sh

if test -z "$2"; then
        echo "$(basename $0): missing argument for option -foo" >&2
        exit 1
fi
echo "$(basename $0) called with argument $2"
$ ./my-script -foo "$(no-such-cmd)" bar
-bash: no-such-cmd: command not found
my-script: missing argument for option -foo

这是简化的,我不做任何选择,但这一点应当明确。 炮弹向<条码>米-字母传送,通过空洞作为参数发生错误。 炮弹肯定知道从<条码>中恢复的状态,但你却抛弃了这种状态。 如果你要提前发现,你可以永远做到:

$ arg="$(no-such-cmd)" && ./my-script -foo "$arg" bar
-bash: no-such-cmd: command not found
$ arg="value" && ./my-script -foo "$arg" bar
my-script called with argument value

与此相比,关于伤员的90%问题(即构成这一统计数据,而且可能很少),这确实是一个引证问题。 如果你不援引指挥替代物,这并不可行,因为“条形状”栏目/条形没有空示作为理由。 如果适用引文,空示可视之为问题,通过“条形状”查询。

自2006年以来 我在谈到引言时,我要指出,它不需要任何一项任务,你也可以说:

$ arg=$(no-such-cmd) && ./my-script -foo "$arg" bar
-bash: no-such-cmd: command not found
$ arg=value && ./my-script -foo "$arg" bar
my-script called with argument value

但是,由于文字分配的时间安排和报价的必要性似乎不为人所知,因此,最佳做法建议在这些地方使用报价。 一般规则:总是引证含有可变和/或指挥替代的价值观。

在您的案例中,<代码>fxn并不很好地阐述其论点,也不发现空洞论点为错误。 如果是的话,你需要确定<代码>fxn。 但是,如果它恰当地压制其论点,并在看到空洞时产生错误,那么你就只需要把双面引述放在指挥替代上。

如果你从档案中读到这些论点,则需要修改以下数据线:-x美元(无此类)。 由于你是关于这些投入线的<代码>eval,你显然完全控制了这些投入,并能够作出这一修改。 如果你不能完全控制这一投入,而你正在打上<代码>eval<>/code>,那么情况是无望的。 你加入了黑暗的一边。





相关问题
Parse players currently in lobby

I m attempting to write a bash script to parse out the following log file and give me a list of CURRENT players in the room (so ignoring players that left, but including players that may have rejoined)...

encoding of file shell script

How can I check the file encoding in a shell script? I need to know if a file is encoded in utf-8 or iso-8859-1. Thanks

Bash usage of vi or emacs

From a programming standpoint, when you set the bash shell to use vi or emacs via set -o vi or set -o emacs What is actually going on here? I ve been reading a book where it claims the bash shell ...

Dynamically building a command in bash

I am construcing a command in bash dynamically. This works fine: COMMAND="java myclass" ${COMMAND} Now I want to dynamically construct a command that redirectes the output: LOG=">> myfile.log ...

Perform OR on two hash outputs of sha1sum

I want perform sha1sum file1 and sha1sum file2 and perform bitwise OR operation with them using bash. Output should be printable i.e 53a23bc2e24d039 ... (160 bit) How can I do this? I know echo $(( ...

Set screen-title from shellscript

Is it possible to set the Screen Title using a shell script? I thought about something like sending the key commands ctrl+A shift-A Name enter I searched for about an hour on how to emulate ...

热门标签