【问题标题】:Script Always runs from / instead of current directory脚本始终从 / 而不是当前目录运行
【发布时间】:2013-09-16 13:02:46
【问题描述】:

所以得到这个。我已经用 ./something.sh 和 sh something.sh 运行我的脚本大约 3 个月了。这些脚本总是从我启动它们的目录中运行。

现在我的脚本突然不起作用了,因为它们似乎是从 / 而不是当前目录启动的。例如,假设我的脚本如下所示:

cd players

rm *

它没有进入播放器,而是因为找不到文件夹“播放器”而出错,然后尝试删除整个根文件系统。 (幸运的是,我没有以 Sudo 或 Root 身份运行这些)。

有什么想法吗?这是以前的工作发现,现在才开始起作用!

谢谢!

【问题讨论】:

  • 你从哪里运行你的脚本?
  • 您应该立即将脚本更改为rm players/*。之后尝试解决问题。
  • mnagel 是对的。但最好使用完整路径:rm /path/to/players/*
  • 您可以声明和导出用于创建完整路径的全局变量。易于配置和更改。
  • 我会使用完整路径,但是当我创建脚本时(它显然比我放的要大,我只是以此为例)我需要制作它,所以我没有无论我把它放在哪个目录中都要改变它。这就是我不使用完整路径的原因。奇怪的是它随机停止工作。我会尝试这些事情,让每个人都知道它是否有效。不过还是很好奇发生了什么!

标签: bash shell ubuntu scripting


【解决方案1】:

为了安全起见,您可以将线路更改为

cd players && rm *

如果成功更改为players,它只会删除players的内容。

【讨论】:

    【解决方案2】:

    试试这个:

    cd ./players
    
    rm *
    

    应该按预期工作!

    【讨论】:

    • 我会试试这个,如果可行,我会试试 rm player/* 有什么想法可能会改变吗?
    • '.'这里指的是当前的工作目录,在你的情况下它是缺失的。
    • cd 已经将相对路径视为相对于当前工作目录的路径。显式添加./ 有何帮助?
    【解决方案3】:

    我只能猜测您的脚本现在是以不同的方式启动的;我能想到的最有可能的是,它们是由没有主目录(不再)或类似目录的用户的 cron 作业调用的。

    但这确实是在黑暗中拍摄。我建议更多地考虑您的脚本是如何开始的,并就该主题进行调查。

    【讨论】:

    • 我希望我可以说我确实改变了我启动它们的方式,但我没有。 :(
    • 发生了一些变化。您可以通过描述如何启动脚本来帮助找到答案。然后我可以对造成这种情况的原因(更新、用户数据库的变化、网络访问的变化……)进行更有根据的猜测。