【问题标题】:Passing an alias as a function parameter将别名作为函数参数传递
【发布时间】:2013-03-17 07:59:09
【问题描述】:

这里是 bash 脚本的新手。已经为我的 bash_profile 配备了一些有用的函数来查询一些 mysql 数据库,但是在让 bash 将传递的参数识别为别名时遇到了麻烦。详情见下文:

function findfield() {
    $2 -e
    "SELECT TABLE_NAME,TABLE_SCHEMA,COLUMN_NAME AS 'Matched Field'
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME LIKE '$1';"
}

示例用法:

findfield %field% mpc

其中 mpc 是指向要查询的数据库的别名。此用法返回错误:

-bash: mpc: command not found

如果我只是硬编码 mpc 来代替 $2,上面的函数就可以工作——那么为什么不能用别名作为参数来代替它呢?

【问题讨论】:

    标签: bash terminal


    【解决方案1】:

    默认情况下,别名在非交互式 shell 中不起作用。您可以使用 shopt -s expand_aliases 更改它,但我不确定它是否会有所帮助。

    您需要另一层评估。当 bash 完成替换所有内容并想要运行该命令时,它会将“mpc”视为一个字符串。您可以使用eval 修复此更改,但是您需要保护其他参数,如果有人传递了一些顽皮的东西怎么办?这就是为什么通常不赞成使用 eval 的原因。但有时这是不可避免的:

    $ run() { $1; }
    $ alias alal=uname
    $ run whoami
    lynx
    $ run alal
    bash: alal: command not found
    $ run() { shopt -s expand_aliases; $1; shopt -u expand_aliases; }
    $ run alal
    bash: alal: command not found
    $ run() { shopt -s expand_aliases; eval $1; shopt -u expand_aliases; }
    $ run alal
    Linux
    

    无论如何,您还需要修复 sql 中的引用,否则该字段将永远无法扩展。此处突出显示的语法使这一点显而易见。一个简单的方法就是将 $1 括在一对 " 中,这样您就可以有效地将字符串分成三个直到它被传递。

    【讨论】:

      【解决方案2】:

      您可能需要在bash_profile 文件中添加额外的一行:

      function myalias_func()
      {
              some code here with different variables $1, $2...
      }
      alias myalias=myalias_func
      

      即尝试包含该行

      alias findfield=findfield
      

      然后它应该可以工作了。

      【讨论】:

        猜你喜欢
        • 2016-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-23
        • 2011-05-11
        • 1970-01-01
        • 2012-09-10
        • 1970-01-01
        相关资源
        最近更新 更多