从mysql执行时找不到linux bash自定义函数

nr7wwzry  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(270)

我不熟悉linux shell脚本。我在bashrc文件中创建了一个函数sel1。

function sel1(){
        echo "select * from table limit 1;"
}

当从bash调用此函数时,该函数按预期工作

akshayk@AKSHAY-PC:/$ sel1
select * from table limit 1;

我还发现,我们可以在mysql连接之后运行bash命令,比如下面的ls命令

mysql> \! ls
acct  bin  boot  cache  data  dev  etc  home  init  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

但是当我从mysql调用函数时,它说找不到

mysql> \! sel1
sh: 1: sel1: not found - What could be the problem here ?

还有一种方法可以在光标位置获取函数的输出吗?
为了测试这一点,我在windows10上使用了ubuntubash。我计划运行这些命令的系统正在运行centos。
谢谢你的帮助。

suzh9iv8

suzh9iv81#

nic3500做得很好,但是让我补充一点,shell是进程,函数没有导出到子进程。当你定义 sel1 函数,你在父shell中。你启动了mysql,进程2并尝试运行 sel1 通过跑步 \! ,产生过程3。
您可以通过查看shell进程id、启动mysql并再次查看进程id来看到这一点。我试了一下,得到了:

$ bash
$ function sel1 {
>     echo "select * from table limit 1;"
> }
$ sel1
select * from table limit 1;
$ export sel1
$ bash
$ sel1
bash: sel1: command not found

如果您有一个复杂的函数,则需要运行定义该函数的脚本,然后在同一个脚本中调用该函数 \! 调用。
至于将函数输出发送到游标位置,我认为您希望运行一个脚本,该脚本在sql提示下生成一个select。为此,我认为最好的办法是使用shell生成一个脚本,然后批处理。

3b6akqbq

3b6akqbq2#

ls 实际上是 /bin/ls ,一个可执行文件,并在path变量中定义。mysql不运行 .bashrc 文件,所以它不知道这个函数。
将函数修改为脚本,并确保其路径包含在path变量中。
例如:文件 /home/youruser/sel1 ,具有可执行权限:


# !/bin/bash

echo "select * from table limit 1;"

将“/home/youruser”放入path变量中。然后你就可以运行它了。

相关问题