【问题标题】:Terminal can't understand Bash script; permission denied error?终端无法理解 Bash 脚本;权限被拒绝错误?
【发布时间】:2021-11-25 18:33:47
【问题描述】:

到目前为止,我的脚本运行良好。当我从终端调用 ./mkproj.sh 时,它显示它有两个参数(我假设是因为我用 $1 和 $2 调用它),然后继续给出以下错误消息:

参数数量 2

mkdir: 无法创建目录'/archive': 权限被拒绝

mkdir: 无法创建目录'/backups': 权限被拒绝

mkdir:无法创建目录“/docs”:权限被拒绝

mkdir:无法创建目录“/docs”:权限被拒绝

mkdir: 无法创建目录'/assets': 权限被拒绝

mkdir: 无法创建目录'/database': 权限被拒绝

mkdir: 无法创建目录'/src': 权限被拒绝

mkdir: 无法创建目录'/src': 权限被拒绝

我检查了我的文件,包括隐藏文件,并且没有名为 myproject.xml 的文件。我还拥有 mkproj.sh 的执行、读取和写入权限。这是我的脚本:

#!/bin/bash
check_for_file()
{
echo "first argument $0"
echo "second argument $1"
echo "third argument $2"
echo "num arguments $#"
if [ $# -eq 0 ]; then
        local testing_file=myproject
        if [ -d "$testing_file" ]; then
                echo "Directory name already exists"
                exit

        else
                mkdir -p "$testing_file"/{archive,backups,docs/{html,txt},assets,database,src/{sh,c}}
        fi
else
        local testing_file=$1

        if [ -d "$testing_file" ]; then
                echo "Directory name already exists"
                exit
        else
                mkdir -p "$testing_file"/{archive,backups,docs/{html,txt},assets,database,src/{sh,c}}
        fi
fi
}

check_for_file "$1" "$2"

谢谢!

【问题讨论】:

  • 你把你的脚本叫做什么?在没有任何参数的情况下,您对 check_for_file "$1" "$2" 的调用使用空参数调用 check_for_file。但是$# 仍然会看到两个空字符串,所以$# 仍然是两个。您的else 子句是否以空 $1 运行,因此文件将写入/
  • 似乎缺少testing_file 路径。你检查if [ -d "$testing_file" ]; 上的testing_file 路径了吗?您需要将其更改为完整路径或相对路径。
  • 如何检查 testing_file 路径?我不确定这意味着什么。
  • 未定义变量“myproject”,因此当您执行“testing_file=myproject”时,“testing_file”将为空,稍后当您尝试使用变量“testing_file”创建文件夹时,您实际上是在创建“/”下的文件,并且运行脚本的用户没有权限。
  • @gogo:您没有编写调用脚本的方式,因此很难判断究竟出了什么问题。你为什么不用-x 运行你的脚本,看看它为什么以及在哪里退出?

标签: bash permissions


【解决方案1】:

好像你想在你的某个目录中找到$testing_file,如果你找不到任何东西,你似乎想创建一个名为$testing_file的目录。

那么,至少你需要像这样修复你的代码:

if [ -d ./$testing_file ]; then

您需要将您的testing_file 路径更改为相对路径或绝对路径(完整路径)。

在您的原始代码中,您的 if 条件表达式正在检查根目录 (/) 是否存在 $testing_file

【讨论】:

  • 谢谢,如何更改文件路径?我需要制作路径变量吗?如果 $1 附带一条路径怎么办? (抱歉所有问题)
  • hmm.. 你的意思是像../tmp/myproject/home/user/Documents/tmp/myproject?试试这个stackoverflow.com/a/4045350/6345487
【解决方案2】:

这是因为您试图在“/”(根文件夹)中创建一个文件夹,而您需要使用 sudo 来执行此操作。 尝试在 if 之前添加类似的内容

cd $pwd

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2015-04-09
    • 2016-04-28
    • 2018-12-25
    • 1970-01-01
    • 2016-07-16
    相关资源
    最近更新 更多