Bash脚本DBMS项目中文件存在却提示“No such file or directory”问题
Bash脚本偶发文件不存在问题排查与解决
在开发DBMS项目的Bash脚本时,遇到一个偶发问题:目标文件实际存在且单独运行正常,但从Main_Menu.sh中source该文件时,有时会提示No such file or directory,有时又能正常执行。
相关脚本代码
Drop_DB.sh
#!/bin/bash read -rp "Enter the name of db you want to remove: " db_name # we use this variable as flag to check everything is ok. error="" # function for validations function validation { if [ -d "./DataBases" ] then error="0" else error="1" echo "Error! DataBases file not exist ❌" fi if [ -d "./DataBases/$db_name" -a $error = 0 ] then error="0" else error="1" echo "Error! No Database with this name: $db_name ❌" fi } # Call function validation first validation if [ $error -eq 0 ] then rm -r "./DataBases/$db_name" echo "Database: $db_name deleted successfully ✓ ✓" else echo "Can't complete this action ❌" fi
List_DB.sh
#!/bin/bash error="" function validation { if [ -d "./DataBases" ] then error="0" else error="1" echo "Error! DataBases file not exist ❌" fi if [ ! -d "./DataBases/" -a $error = 0 ] then error="1" echo "Error! There's no DBs yet ❌" else error="0" fi } # call validation function validation if [ $error -eq 0 ] then # 3 - display only directories. cd ./DataBases ls -d */ else echo "Can't complete this action ❌❌" fi
Main_Menu.sh
#!/bin/bash options=("Create Database" "List Databases" "Connect To Databases" "Drop Database" "Exit") PS3="Enter choices from 1 to 5: " while [[ "$choice" != "Exit" ]] do echo " " select choice in "${options[@]}" do case $choice in "Create Database" ) source ./Create_DB.sh break ;; "List Databases" ) source ./List_DB.sh break ;; "Connect To Databases" ) source ./Connect_DB.sh break ;; "Drop Database" ) source ./Drop_DB.sh break ;; "Exit" ) exit break ;; *) echo "Invalid input please try again later" ;; esac done done
权限检查结果
已确认文件权限正常:
$ ls -l -rwxrwxr-x. 1 aem aem 804 Apr 8 14:45 Drop_DB.sh -rwxrwxr-x. 1 aem aem 696 Apr 8 14:41 Mainmenu.sh
报错信息
./Mainmenu.sh: line25: ./Drop_DB.sh: No such file or directory
问题原因与解决
问题根源在于List_DB.sh中执行cd ./DataBases后,未切换回原工作目录。由于source命令会在当前shell环境中执行脚本,执行完List_DB.sh后,当前工作目录会变成DataBases,后续再执行source ./Drop_DB.sh时,会在DataBases目录下查找该文件,而脚本实际存放在主目录,因此提示文件不存在。
解决方法:在List_DB.sh的cd ./DataBases执行完成后,添加cd ..切换回原目录:
if [ $error -eq 0 ] then # 3 - display only directories. cd ./DataBases ls -d */ cd .. # 回到原工作目录 else echo "Can't complete this action ❌❌" fi
更稳妥的方式是使用子shell执行切换目录后的命令,避免改变当前shell的工作目录:
if [ $error -eq 0 ] then # 用子shell执行,不影响当前目录 (cd ./DataBases && ls -d */) else echo "Can't complete this action ❌❌" fi
内容的提问来源于stack exchange,提问作者AEM
相关产品推荐
相关产品推荐

