【问题标题】:define a function-like macro in bash在 bash 中定义一个类似函数的宏
【发布时间】:2012-04-28 12:07:19
【问题描述】:

是否可以在 bash 中定义宏函数,所以当我编写时:

F(sth);

bash 运行这个:

echo "sth" > a.txt;

【问题讨论】:

    标签: linux bash ubuntu macros


    【解决方案1】:
    F () {
      echo "$1" > a.txt
    }
    

    调用时不要使用括号。这就是你的称呼:

    F "text to save"
    

    【讨论】:

      【解决方案2】:

      是的,只有您应该使用F sth 调用它:

      F()
      {
        echo "$1" > a.txt
      }
      

      阅读更多here

      【讨论】:

        【解决方案3】:

        不能让任意语法做任何事情。括号是元字符,对解析器具有特殊意义,因此您无法将它们用作有效的名称。扩展 shell 的最佳方式是定义函数。

        这将是一个基本的echo 包装器,它始终写入同一个文件:

        f() {
            echo "$@"
        } >a.txt
        

        这和 echo's -e-n 选项差不多,但额外处理标准输入:

        f() {
            [[ ${1+_} || ! -t 0 ]] && printf '%s\n' "${*-$(</dev/fd/0)}"
        } >a.txt
        

        可以称为

        f arg1 arg2...
        

        f <file
        

        函数以与任何其他命令相同的方式传递参数。

        第二个类似 echo 的包装器首先测试 set first argument 或来自非 tty 的标准输入,并使用位置参数(如果已设置)或标准输入有条件地调用 printf。测试表达式避免了零参数和没有从文件重定向的情况,在这种情况下,Bash 会尝试扩展终端的输出,挂起 shell。

        【讨论】:

        • +1,很好的答案。您介意更详细地解释为什么您使用更复杂(但更好)的构造来输出参数吗?
        • 它只允许从标准输入或参数输入。测试表达式防止出现 args 和 stdin 都来自终端的情况,在这种情况下,必须终止 shell,因为进程拥有的 tty 正在被读取和阻塞。如果通过了,那么位置参数将被扩展(如果设置),或者扩展将从函数的输入中读取。使用cat 可以实现稍微更便携但速度更慢的解决方案 - 这需要具有真正 /dev/fd/* 的系统。我刚刚发布了这个技巧,因为我之前的答案与其他答案相同。 :)
        • 另外,它确实允许多个参数,就像echo 一样。您的函数适用于f one two three,而其他函数仅适用于f "one two three"。给定没有引号的输入,其他解决方案只会考虑第一个单词(这里:“one”)。
        • 如果您可以在答案中包含这些解释,那就太好了,以便其他人可以从中学习。
        • 添加了一点解释。处理与 echo 相同的功能可能会变得更加复杂,但这似乎有点超出了这个问题的范围,需要一些选项解析
        【解决方案4】:

        这是很久以前回答的,但要提供一个满足原始请求的答案(即使这可能不是真正想要的): 这是基于 Simon Tatham 的Magic Aliases: A Layering Loophole in the Bourne Shell

        F() { str="$(history 1)"; str=${str# *F(}; echo "${str%)*}"; } >a.txt
        alias F='\F #'
        
        $ F(sth)
        $ cat a.txt
        sth
        

        另请参阅 ormaaj 的 better magic alias

        【讨论】:

        • 抱歉,必须插上它。 history 几乎和别名一样蹩脚 :) 通过利用递归别名扩展,可以实现不使用 BASH_ALIASES 的更复杂的半便携版本。但只有total crazy nut case 会写这样的代码。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-29
        • 2012-01-15
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 2021-12-08
        • 2020-01-09
        相关资源
        最近更新 更多