假设我有CDPATH
其中包含我想要的路径,cd
以防在中找不到它.
在不使用cd
自身的情况下,我如何获得满足它的第一条路径bash
其目的是使cd
do 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