You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:23:12