【问题标题】:Bash scripting: mkdir errorBash 脚本:mkdir 错误
【发布时间】:2012-09-08 09:04:36
【问题描述】:

我有以下脚本示例:

#!/bin/bash

# Aborts the script on "simple command failure" (does not cover pipes)
set -e

# Makes sure we do not run the script outside the correct directory (i.e. the backup directory)
projects_directory='~/projects' 
backup_drectory="${projects_directory}/backup/"
echo "Backup directory: ${backup_drectory}"

if [ ! -d "$projects_directory" ]; then 
    mkdir "$projects_directory"
    echo "${projects_directory} created successfully" 
fi

失败了,输出如下:

Backup directory: ~/projects/backup/
mkdir: cannot create directory `~/projects': No such file or directory

我不明白为什么。如果我在终端中手动输入mkdir ~/projects 命令,则会创建目录。任何建议都是最受欢迎的。

【问题讨论】:

  • 尝试将 ~ 替换为您的绝对主目录 (/home/username/)。哪个用户执行您的备份脚本(您使用的是 cron 作业吗?)
  • 我打算使用 cron,是的。到目前为止,我正在通过终端手动测试它。您的解决方案有效。你能给我解释一下为什么吗?是否有任何解决方法,所以我不必将用户路径硬编码到脚本中?
  • Shell 引用是你的敌人。您可以在此处了解 shell 如何处理单引号和双引号:mywiki.wooledge.org/Quotes
  • lanzz给出的答案是正确的。确保由正确的用户启动脚本(使用用户 shell 中的 crontab -e)

标签: bash quotes sh mkdir


【解决方案1】:

去掉单引号:

projects_directory=~/projects

引用阻止 shell 扩展 ~ 字符。

【讨论】:

  • 谢谢!初学者的错误;)
  • +1。我还建议使用mkdir -p(根据需要创建父目录)。
  • 谢谢 x2!所以我不需要检查~/projects是否存在,我可以直接发出mkdir -p ~/projects/backup。先生,你让我开心!