【发布时间】:2016-01-06 20:32:49
【问题描述】:
realpath 非常好,因为它为您提供了一种获取文件真实路径的简单方法,但我无法找到满足我需求的方法(不进行自己的字符串操作,因此可能缺少一个专门的实用程序可能已经找到并解决的极端情况)。简而言之,我想在它返回的路径中包含~,这样它就可以跨机器有效。
因此,如果我在 ~/bin 中输入 realpath --some-option script.sh,我希望它返回 ~/bin/script.sh 而不是 bin/script.sh,如果我使用的选项是 --relative-base=$HOME,而不是/Users/brandon/bin/script.sh,如果我不使用任何选项,我会得到。
有没有什么方法可以从realpath 得到我想要的东西,或者有没有其他实用程序可以简单地完成我想要的东西?或者是通过sed 获得我想要的唯一真正的选择?
(附注:我在 OS X 上,但我已经安装了 GNU 实用程序,以备不时之需……我不确定这是 realpath 的来源还是现在默认安装在更新的 OS X 版本。)
【问题讨论】:
-
一般来说,拥有
~对人类展示以外的其他目的是有害的——shell 只在少数情况下进行波浪号扩展,open()等不会兑现它完全没有。 -
通过 sed 进行管道传输显然并不难,但似乎 应该 已经内置了一些我忽略的东西......否则它的
realpath ../some/path/ | sed -e "s|$HOME|~|" -
@CharlesDuffy:我将编写使用路径的代码,所以我可以确保它可以处理
~好的。但您的观点可能是没有其他人认为适合将此选项添加到realpath的原因。 -
假设您要捕获到一个 shell 变量,当然可以执行类似
[[ $path = "$HOME"/* ]] && path="~/"${path#"$HOME/"}的操作,而开销比启动诸如sed之类的外部命令要少(而且错误更少——没有机会主目录名称中的字符被视为正则表达式内容而不是文字)。