shell “没有这样的文件或目录”,但它存在,它的工作

pexxcrt2  于 2023-04-12  发布在  Shell
关注(0)|答案(1)|浏览(106)

我正在使用bash脚本进行DBMS项目。我遇到了一个问题No such file or directory,但该文件已经存在,并且它也在工作,但当我从Main_Menu文件中获取此文件时,它无法按预期工作。有时它可以工作,有时不可以。

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

主菜单.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

********************************"No such file or directory" but it exists,但仍具有相同的错误。
编辑:

我这里的问题是我在List_DB.sh文件中做了cd来列出那里的所有目录。所以,在执行List_DB.sh之后,我的pwdDataBases/$DB_Name目录,脚本位于另一个路径,这意味着DataBases/$DB_Name中的No such file or directory。我通过在List_DB.sh文件中添加cd ..来解决这个问题,以返回主文件夹。

xzabzqsa

xzabzqsa1#

几个问题/观察:

  • 主脚本调用List_DB.sh,但是这个文件不在你的ls -l输出中,你的脚本是否位于不同的目录中?
  • 由于您正在获取脚本文件,因此不需要“execute”权限

请记住:

  • 当一个脚本被执行时,一个子shell将被生成,并且当脚本退出时,子shell中的大多数操作(例如,变量赋值,cd操作)都“丢失”(在cd的情况下,就好像cd被“撤消”,并且您被留在了您开始的目录中)
  • 在源脚本的情况下,命令(在脚本中)在当前shell中执行,因此当脚本退出时,shell中所做的任何更改(变量赋值,cd操作)都保留在主shell中(在cd的情况下,您不会返回到开始的位置)

我的猜测是:最后一个成功 sourced 的脚本(List_DB.sh?)执行了一个操作(例如,cd),使父脚本位于不同的目录中,因此出现了错误消息。

相关问题