gpt4 book ai didi

bash - 使用波浪号将目录更改为文件中指定的路径

转载 作者:行者123 更新时间:2023-11-29 09:17:37 24 4
gpt4 key购买 nike

我有一个文件,比如:~/cwd。该文件的内容是一行:

~/tmp

我想要 fo cd 到这个 (~/tmp) 目录。我正在尝试:

> cd `cat ~/cwd`

得到:

-bash: cd: ~/tmp: No such file or directory

为什么相对路径失败了?当 ~/cwd 的内容是绝对路径时 - 它有效。

最佳答案

这不是相对路径的问题——发生这种情况是因为 shell 评估模型在参数扩展之前进行波浪线扩展。跳回到评估过程的最开始,使用 eval,引入了安全漏洞——所以如果真的需要支持这个(我强烈认为这是一个坏主意),一个安全的实现(针对具有getent 命令可用)如下所示:

expandPath() {
local path
local -a pathElements resultPathElements
IFS=':' read -r -a pathElements <<<"$1"
: "${pathElements[@]}"
for path in "${pathElements[@]}"; do
: "$path"
case $path in
"~+"/*)
path=$PWD/${path#"~+/"}
;;
"~-"/*)
path=$OLDPWD/${path#"~-/"}
;;
"~"/*)
path=$HOME/${path#"~/"}
;;
"~"*)
username=${path%%/*}
username=${username#"~"}
IFS=: read _ _ _ _ _ homedir _ < <(getent passwd "$username")
if [[ $path = */* ]]; then
path=${homedir}/${path#*/}
else
path=$homedir
fi
;;
esac
resultPathElements+=( "$path" )
done
local result
printf -v result '%s:' "${resultPathElements[@]}"
printf '%s\n' "${result%:}"
}

...将其用于安全地从文件中读取的路径:

printf '%s\n' "$(expandPath "$(<file)")"

或者,一种更简单的方法,谨慎使用 eval:

expandPath() {
case $1 in
~[+-]*)
local content content_q
printf -v content_q '%q' "${1:2}"
eval "content=${1:0:2}${content_q}"
printf '%s\n' "$content"
;;
~*)
local content content_q
printf -v content_q '%q' "${1:1}"
eval "content=~${content_q}"
printf '%s\n' "$content"
;;
*)
printf '%s\n' "$1"
;;
esac
}

关于bash - 使用波浪号将目录更改为文件中指定的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18740167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com