什么时候“cd”命令会在 shell 脚本中失败,我该怎么做才能补救?

som*_*ing 0 cd-command shell-script command pwd

我有一个上周未能完成的 shell 脚本;这是一个失败的“ cd”命令,如果失败则退出。

该脚本是bash用于配置新 Debian 安装的shell 脚本。这是完整的脚本:debianConfigAswome.sh。该脚本以 root 身份运行,因此它可以完全访问文件系统。

您能否列出脚本无法成功执行cd命令的所有原因以及如何避免错误?

ter*_*don 7

acd可能失败的原因有多种。目标可能不存在,目标可能不是目录,您可能没有访问目标目录的权限,cd可能找不到(尽管这是极不可能的,因为它是内置的 shell),chdir()操作可能因损坏而失败文件系统等

然而,在这种特殊情况下,它看起来像是脚本中的一个错误。您链接到的脚本有两个调用cd

cd "$WORK_DIR"/nanorc || { echo "cd failed"; exit 127; }
Run Code Online (Sandbox Code Playgroud)

cd $HOME || { echo "cd $HOME failed"; exit 155; }
Run Code Online (Sandbox Code Playgroud)

我假设失败的是第一个,因为cd $HOME应该正常工作。这是脚本的相关(稍微简化)部分:

if [ ! -d "$WORK_DIR"/nanorc  ]
then
    echo "Setting up Nanorc file for all users....please, wait!"
    git clone https://$OAUTH_TOKEN:x-auth-basic@github.com/gnihtemoSgnihtemos/nanorc || { echo "git failed"; exit 127; }
    chmod 755 "$WORK_DIR"/nanorc || { echo "chmod nanorc failed"; exit 127; }
     cd "$WORK_DIR"/nanorc || { echo "cd failed"; exit 127; }
fi
Run Code Online (Sandbox Code Playgroud)

因此,如果 "$WORK_DIR"/nanorc不是目录,则运行git创建nanorc目录的命令。第一个可能的问题是nanorc将在当前目录中创建,而$WORK_DIR. 在您的脚本中,此时您还没有真正移动到$WORK_DIR,因此只有在您从$WORK_DIR.

所以简单的解决办法是cd $WORK_DIRgit命令前加一个:

if [ ! -d "$WORK_DIR"/nanorc  ]
then
    cd "$WORK_DIR" | { echo "cd $WORK_DIR failed"; exit 127; }
    echo "Setting up Nanorc file for all users....please, wait!"
    git clone https://$OAUTH_TOKEN:x-auth-basic@github.com/gnihtemoSgnihtemos/nanorc || { echo "git failed"; exit 127; }
    chmod 755 "$WORK_DIR"/nanorc || { echo "chmod nanorc failed"; exit 127; }
     cd "$WORK_DIR"/nanorc || { echo "cd failed"; exit 127; }
fi
Run Code Online (Sandbox Code Playgroud)