bash使用菜单从脚本更改目录

bash使用菜单从脚本更改目录,bash,Bash,如何使此脚本实际更改我所在的目录 所以脚本只是从数据库中获取一些选项 然后在我选择了我想要的一个之后,它就不起作用了 我也试着用源代码运行脚本,但仍然没有任何结果 #!/bin/bash options=( $(mysql --skip-column-names -uroot -pmypass all_dbs -e "select path from databases_table WHERE locked != 0 ") ) read_list(){ echo

如何使此脚本实际更改我所在的目录

所以脚本只是从数据库中获取一些选项 然后在我选择了我想要的一个之后,它就不起作用了 我也试着用源代码运行脚本,但仍然没有任何结果

    #!/bin/bash
    options=( $(mysql --skip-column-names -uroot -pmypass all_dbs -e "select path from databases_table WHERE locked != 0 ") )

    read_list(){
    echo ""
    PS3="Change directory to:"
    select opt in "${options[@]}" "Quit" ; do
        if (( REPLY == 1 + ${#options[@]} )) ; then
            exit
        elif (( REPLY > 0 && REPLY <= ${#options[@]} )) ; then
            chosen="$opt"
            break
        else
            echo "Invalid option. Try another one."
        fi
    done
    }

    changeto_entry(){
    mysql -uroot -pmypass --skip-column-names all_dbs -e "select name,\`database\`,path from databases_table where locked != 0 AND name = '$chosen'" | while read name database path; do
        cd $path
    done
    }

    read_list
    changeto_entry

当前工作目录将用于脚本,而不是您。i、 e.终端用户在执行后将恢复正常。

如果您将脚本作为源代码而不是作为正常脚本运行,则脚本可能会正常工作:

source ./mycdscript.sh
这将在与bash提示符相同的shell中评估脚本中的命令

但是要小心,因为脚本中设置/定义的任何变量/函数仍将在提示shell中定义。

您正在尝试在管道创建的子shell中进行cd。下面是一个显示相同问题的简单测试用例:

true | cd /

要修复它,您可以在读取时重写管道cmd;做在读取时使用来自进程替换的重定向;做done<有没有办法让它更改我的目录?我不知道有什么办法,但是想象一下,如果您运行的每个脚本都会在文件系统中移动您,因为作者忘了将您放回去。很烦人。你确定$path变量已经设置好了吗?你能在while循环中回显它的值吗?我使用了echo cd$path,我看到它正在被设置。我鼓励你尝试这个脚本-也许用一些数组替换mysql。。。非常奇怪,你能提供选项数组可能设置为什么的示例,以及第二个mysql命令的示例输出吗?+1这几乎肯定是正确的答案。我在长队末端的管子上涂了一层玻璃。当然,脚本也需要来源。
changeto_entry(){
  while read _ _ path
  do
    cd "$path"
  done  <   <(mysql -uroot -pmypass --skip-column-names all_dbs -e "select name,\`database\`,path from databases_table where locked != 0 AND name = '$chosen'")
}