从路径中删除底层

时间:2014-05-17 02:59:00

标签: bash

我正在编写一个脚本,我想检查相对于脚本工作目录的文件夹是否在shell的路径中。

例如,如果项目结构是:

top/
 bin/
 tests/
  test1/
   foo.sh
  test2/
   foo.sh

我想检查来自top/bin PATH的{​​{1}}是否在foo.sh。我知道以下内容可行:

cd ../../bin
if echo $PATH|grep `pwd`; then
  echo "Success"
else
  echo "Failure"
fi

但是我必须跟踪我开始的目录,以便我可以cd回到那里。我可以在pwd之后删除最后两个目录,然后将bin附加到其中吗?有没有其他智能方法来处理这个? 作为奖励,我想使这个脚本对tests内的其他目录级别具有强大的功能,但如果它使事情复杂化则不是必需的。

3 个答案:

答案 0 :(得分:2)

# Exits with code 0 if the first argument is on the user's path.
is_on_path() {
  CANONICAL_NAME=$(readlink -f "$1")
  while read -r -d: COMPONENT; do
    if [[ "$CANONICAL_NAME" = "$COMPONENT" ]]; then
      return 0
    fi
  done <<< "$PATH"
  return 1
}
  • readlink -f会根据需要评估../..等路径组件。
  • read -r -d: COMPONENT将从输入中读取以冒号分隔的参数列表,并将其读入COMPONENT变量。
  • <<< "$PATH"会将系统路径传递到while的标准输入。

现在你可以这样打电话:

if is_on_path "../../bin"; then
  echo "Success!"
else
  echo "Failure!"
fi

加分:从这里可以很容易地将其递归应用于所有父目录:

find_matching_ancestor() {
  current_dir=$(pwd)
  while [[ "$current_dir" != "/" ]]; do
    if is_on_path "$current_dir/bin"; then
      echo "$current_dir"
      return 0
    fi
    current_dir=$(dirname "$current_dir")
  done
  return 1
}

答案 1 :(得分:0)

这似乎有效

echo $PATH | xargs -d: -n1 | grep ^$(readlink -f ../../bin)$ | wc -l

答案 2 :(得分:0)

也许最可靠的方法是将一个可执行位设置的文件放到该目录中并使用&#34;&#34;。

例如,我的PATH上是/ bin吗?

which ls
/bin/ls