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

时间:2014-03-04 18:09:44

标签: bash

如何让这个脚本真正改变我所在的目录?

所以脚本只是从数据库中获取一些选项 然后我选择我想要的那个,它不起作用 我也尝试使用源代码运行脚本但仍然没有...

    #!/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

3 个答案:

答案 0 :(得分:1)

您正在尝试在管道创建的子shell中cd。这是一个更简单的测试用例,表现出同样的问题:

true | cd /

要修复它,您可以重写管道(cmd | while read; do ..; done)以使用来自流程替换的重定向(while read; do ..; done < <(cmd)):

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'")
}

现在,如果您的mysql命令正确,则获取文件将更改目录。

答案 1 :(得分:0)

当前工作目录将用于脚本,而不适合您。即终端用户在执行后将恢复正常状态。

答案 2 :(得分:0)

如果您source它而不是以普通脚本运行它,您的脚本可能会有效:

source ./mycdscript.sh

这将在与bash提示符相同的shell中评估脚本中的命令。

但请注意,因为脚本中设置/定义的任何变量/函数仍将在提示shell中定义。