终端程序:尽管目录/文件路径正确,但无法找到它们

时间:2018-06-23 01:25:55

标签: shell version-control diff patch

还有什么可能出问题?抱歉,我刚开始编程,所以不确定是否是解决问题的正确方法。

screenshot

这是终端文件中的代码:

echo "Patcher Coded by _Retro_"
PLACE=`dirname $0`
ROM=`ls ${PLACE}/Rom/*.nds | head -n 1`
PATCH=`ls ${PLACE}/Patch/*.* | head -n 1`
NAME=${ROM%.[^.]*}

$PLACE/xdelta3 -dfs $ROM $PATCH $NAME-patched.nds

1 个答案:

答案 0 :(得分:0)

您的脚本说:

PLACE=`dirname $0`

首先,shell执行参数扩展。这意味着(在这种情况下)它将展开$0。变量$0扩展到shell用于执行脚本的路径,因此该行扩展为:

PLACE=`dirname /Users/ShakeyBanks/Desktop/Perfect Heart CE./DS_Rom_Patcher/Rom_Patcher`

请注意,扩展中没有反斜杠!反斜杠在启动脚本之前已由您的交互式外壳程序使用。

然后,外壳程序执行命令替换:它执行`...`中包含的命令。外壳程序将命令分割成空格,因此该命令包含四个单词。第一个单词是要运行的程序,其余三个单词是该命令的参数:

  1. dirname
  2. /Users/ShakeyBanks/Desktop/Perfect
  3. Heart
  4. CE./DS_Rom_Patcher/Rom_Patcher

这里的问题是dirname程序只需要一个自变量,但是您要传递三个。它检测到此错误并失败并显示错误:

usage: dirname path

要解决此问题,请用双引号引用$0,如下所示:

PLACE=`dirname "$0"`

您还需要用双引号引用$PLACE${PLACE}$ROM$PATCH$NAME的所有后续用法,因为它们会有同样的问题。

,将目录重命名为不包含空格。