【问题标题】:Retrieve parent directory of script检索脚本的父目录
【发布时间】:2013-11-25 14:50:40
【问题描述】:

我正在开发一个卸载程序脚本以删除安装该脚本的父文件夹。

/usr/local/Myapplication/Uninstaller/uninstall.sh

所以uninstall.sh 必须这样做:

rm- rf /usr/local/Myapplication

我可以检索卸载所在的文件夹

SYMLINKS=$(readlink -f "$0")
UNINSTALL_PATH=$(dirname "$SYMLINKS")

但我仍然不确定获取父路径的好方法。 我曾想过使用 sed 来删除此路径的“卸载程序”部分,但有没有一种优雅的方法可以获取 Myapplication 文件夹的路径以将其删除?

谢谢

【问题讨论】:

  • 在你的脚本中:cd "$(dirname "$0")" && cd .. && cd .. && [ -d Myapplication/Uninstaller ] && rm -rf Myapplication(我添加了一个检查,我们将要删除的目录包含一个子目录“卸载程序”,但你可以添加一个更好的检查,例如必要的文件在我的应用程序中?)。如果你不知道Myapplication,那么:cd "$(dirname $0)" && cd .. && zepath="$(pwd)" && cd .. && [ -f "${zepath}/somefilesthathouldbehere" ] && rm -rf "${zepath}"
  • 查看著名的Can a Bash script tell what directory it's stored in? 问题,然后从那里查看cd ..

标签: bash shell unix


【解决方案1】:

使用dirname 两次怎么样?

APP_ROOT="$(dirname "$(dirname "$(readlink -fm "$0")")")"

引用desaster仅用于防止路径中的空格。不然会更顺眼:

APP_ROOT=$(dirname $(dirname $(readlink -fm $0)))

【讨论】:

  • 这行得通,但我有点怀疑使用 dirname 两次来实现我想要的。更多出于学习目的有没有办法在单个命令行中获取它?确定APP_ROOT=$(dirname "``$(readlink -f "$0")``") 可以,但还有其他方法吗?
  • 您不必对此感到怀疑。 dirname 专门为您提供路径的目录部分。这正是这样做的正确工具。我更新了语法的答案。
  • 注意,这种方法对于“丑陋”的名字是不安全的。像“-rm -rf”这样的名称将破坏所需的行为。大概 ”。”也会。我不知道这是否是最好的方法,但我在这里创建了一个单独的“以正确性为中心”的问题:stackoverflow.com/questions/40700119/…
【解决方案2】:

只需获取父目录的父目录:

my_app_path=$(dirname $(dirname $(readlink -f "$0")))

【讨论】:

    【解决方案3】:

    如果需要绝对路径,则需要cd。否则你可以使用$(dirname $0)/..

    cd $(dirname $0)/..
    path=$(pwd)
    cd - # go back
    

    【讨论】:

      【解决方案4】:

      获取父目录路径的终极简单方法:

      PARENT_DIRECTORY="${PWD%/*}" 
      

      【讨论】:

      • 这是当前目录的父目录,不是脚本所在的位置。要使用它,我必须先 CD 到脚本目录,这样它就不会太优雅了。
      • @MangO_O : 所以你需要用脚本的目录替换 PWD : DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"; PARENT_DIRECTORY="${DIR%/*}"
      • @AbdennourTOUMI 你的解决方案对我来说效果很好,似乎比接受的答案更容易
      • 欢迎@subelsky。我已将其添加为答案以使其对其他人更可见:stackoverflow.com/a/60559856/747579
      【解决方案5】:

      我把这个answer as comment at 2018。但是由于我得到了关于解决方案有效性的很好的反馈,所以我也将在这里分享:

      # dir of script 
      DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )";
      # parent dir of that dir
      PARENT_DIRECTORY="${DIR%/*}"
      

      【讨论】:

        【解决方案6】:

        脚本父目录的完整路径,即“/usr/local/bin/bla”:export PARENT_OF_THIS_SCRIPT=$( cd $(dirname $0) ; pwd -P )

        只是脚本的最新父级,即“bla”:export PARENT_DIR_OF_SCRIPT=$( cd $(dirname $0) ; pwd -P | xargs basename )

        【讨论】:

          【解决方案7】:

          为什么不简单地在路径末尾添加 ../?

          【讨论】:

          • 这不适用于 rm,UNINSTALL_PATH=$(dirname "$SYMLINKS")/../ 与 rm 命令一起使用时不是正确的父路径
          • 您还需要添加/../。如果,无论出于何种原因,$UNINSTALL_PATH 为空,/../ == / 并且您正在擦除硬盘驱动器。
          【解决方案8】:

          As $0 can have suprising behavior,这是使用BASH_SOURCE[0]的解决方案:

          #/bin/bash
          
          PARENT_DIR=$(dirname $(dirname $(readlink -f "${BASH_SOURCE[0]}")))
          

          【讨论】:

            猜你喜欢
            • 2017-04-09
            • 1970-01-01
            • 2010-12-25
            • 2023-04-02
            • 1970-01-01
            • 2015-01-08
            • 1970-01-01
            • 2011-04-29
            相关资源
            最近更新 更多