在 Bash 中,如何使用类似 PATH 的变量进行查找

在 Bash 中,如何使用类似 PATH 的变量进行查找

假设我有CDPATH其中包含我想要的路径,cd以防在中找不到它.

在不使用cd自身的情况下,我如何获得满足它的第一条路径bash

其目的是使cddo apushd至少在我使用的这个版本的 bash 上pushd不支持。CDPATH但它也适用于其他 bash

答案1

如果您对使用的担忧cd实际上关于移动当前 shell 的工作目录,那么您可以使用命令替换,它会cd在无害地消失的子 shell 中执行:

d=$(cd some-name)

例如:

$ mkdir /tmp/{a..d}
$ CDPATH=/tmp
$ cd /
$ pwd
/
$ dir=$(cd c)
$ printf '%s\n' "${dir%/*}"
/tmp
$ pwd
/

cd c在这里,我捕获了假设中的条目满足它的输出CDPATH。该结果是新的工作目录,因此为了从 中返回相应的路径条目CDPATH,我使用参数扩展来删除最后一个正斜杠——本质上是最深目录的名称。就变成了上面的/tmp/c样子/tmp

答案2

假设你的意思是

给定 的某个值,我会进入$CDPATH哪个目录?cd foo不使用 可以找到这个吗cd

好的,所以cd foo,当$CDPATH设置时,将查看每个:- 分隔值$CDPATH以尝试查找名为 的子目录foo

#!/bin/bash

dir=$1
cdpath=${2:-$CDPATH}

if [ -z "$cdpath" ] && [ -d "$dir" ]; then
    printf '"cd %s" would take you to %s\n' "$dir" "$dir"
    exit
elif [[ $dir == /* ]] || [[ $dir == ./* ]] || [[ $dir == ../* ]]; then
    # special cases where $CDPATH is not used
    if [ -d "$dir" ]; then
        printf '"cd %s" would take you to %s (ignoring $CDPATH)\n' "$dir" "$dir"
        exit
    else
        printf 'Did not find destination directory for %s\n' "$dir"
        exit 1
    fi
fi

while [ -n "$cdpath" ]; do
    subdir=${cdpath%%:*}/$dir
    if [ -d "$subdir" ]; then
        printf '"cd %s" would take you to %s\n' "$dir" "$subdir"
        exit
    fi
    [[ $cdpath != *:* ]] && break
    cdpath=${cdpath#*:}
done

printf 'Did not find destination directory for %s\n' "$dir"
exit 1

该脚本将查看CDPATH作为其第二个参数(或在其环境中)给出的变量值,并尝试找出cd当其目标目录作为脚本命令行上的第一个参数给出时将带您到哪里。

自从CDPATH 不应出口,该脚本必须作为以下任一方式调用

CDPATH=$CDPATH ./script.sh dir-name

或作为

./script.sh dir-name "$CDPATH"

该脚本首先测试是否$CDPATH为空。如果是,cd dir将带您dir进入当前目录。它还处理一些应该绕过使用的特殊情况$CDPATH

如果$CDPATH不为空,则脚本开始从其值中逐一挑选元素,以查看指定目录是否作为所提到的任何路径的子目录存在。

:通过从其值的第一个值到$cdpath末尾删除来选取第一个值。$cdpath稍后设置为删除直到第一个 得到的值:。这样,循环将遍历 in 中的路径,并且仅在找到有效目录或字符串中$cdpath最终没有其他字符时退出。:

如果我们越过了循环,我们就找不到有效的目的地cd

注意:我的代码不能处理所有情况。请参阅中的相关位POSIX 标准

答案3

命令怎么样:

 $ find `echo $CDPATH|sed 's/://'` -name 'whatever' -print

相关内容