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