【问题标题】:Trap function by passing arguments?通过传递参数来捕获函数?
【发布时间】:2012-02-29 18:32:41
【问题描述】:

我一直在到处搜索,我开始相信除了拥有全局变量之外别无他法,但我相信 stackoverflow.com 中的大师可能会帮助我:

在 bash 中是否有任何方法可以通过向函数传递参数来捕获函数?
例如,trap <function_name> <arg_1> <arg_2> SIGINT?

【问题讨论】:

    标签: bash shell signals bash-trap


    【解决方案1】:

    trap 允许您指定任意命令(或命令序列),但您必须将该命令作为单个参数传递。例如,这个:

    trap 'foo bar baz | bip && fred barney ; wilma' SIGINT
    

    会运行这个:

    foo bar baz | bip && fred barney ; wilma
    

    每当 shell 收到 SIGINT。在你的情况下,这听起来像你想要的:

    trap '<function> <arg_1> <arg_2>' SIGINT
    

    【讨论】:

    • 实际上它不起作用,因为调用 trap "myfunction $arg_1 $arg_2" SIGINT SIGTERM 意味着当按下 Ctrl-C 时 $arg_1 $arg_2 的旧值被保留而不是更新的值。猜猜我会使用包装函数或将参数设为全局,因为我无法按照我想要的方式进行工作:/ P.S.:我使用 double_quotes 而不是你的示例中的 single 是否重要?
    • @Kounavi:正如您所猜想的那样——您需要使用单引号,而不是双引号。
    • 是的!单引号起到了作用!可能我在 gVim 中的插件需要更新,因为我有 bash 支持,我认为如果它是正确的,它会“正确着色”。非常感谢朋友! :)
    • @Kounavi:不客气!为了澄清,单引号和双引号都分隔字符串,但双引号允许在字符串内进行反斜杠处理和参数扩展,而单引号则不允许。因此,例如,如果变量 $x 是一个星号,那么 echo $x 列出当前目录中的文件,echo "$x" 打印一个星号,echo '$x' 打印一个美元符号和一个 X。
    • 谢谢!我也会记住这一点,因为这听起来很有用:]
    【解决方案2】:

    也许我误解了你,但是……这是合法的:

    trap "cp /etc/passwd $HOME/p" SIGINT
    trap 'cp /etc/passwd /tmp/p; echo wooo hoo' SIGINT
    

    【讨论】:

    • 只有单引号适用于 $arg1、$arg2 等类型的变量。但是,是的,这就是我所需要的! ;)
    • 我很高兴 Michal 解释得如此透彻,并且您得到了解决。 :)
    【解决方案3】:

    我不确定我是否正确理解你的意思,但如果你想让信号处理程序调用一个函数并传递参数,trap "function arg1 arg2" SIGNAL 应该可以工作。例如,trap "ls -lh /" INT 将导致您的 shell 中的 Ctrl+C 导致调用 ls -lh /(具有 2 个参数的程序)。

    【讨论】:

    • 实际上我没有使用引号并且它不起作用。感谢您的帮助:]
    • 更新:仍然没有(查看我在顶帖中的 cmets)
    • 只需将双引号更改为单引号,扩展将延迟到执行陷阱命令,例如trap 'echo "$PATH"' INT 对 PATH 的任何更改对陷阱函数都是可见的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多