如何让这个脚本真正改变我所在的目录?
所以脚本只是从数据库中获取一些选项 然后我选择我想要的那个,它不起作用 我也尝试使用源代码运行脚本但仍然没有...
#!/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
答案 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中定义。