【发布时间】:2014-01-31 09:28:45
【问题描述】:
我是 nodejs 的新手。节点能否解析~(unix主目录)示例~foo,~bar 到 /home/foo, /home/bar
> path.normalize('~mvaidya') '~mvaidya' > path.resolve('~mvaidya') '/home/mvaidya/~mvaidya' >这个反应是错误的;我希望 ~mvaidya 必须解析为 /home/mvaidya
【问题讨论】:
我是 nodejs 的新手。节点能否解析~(unix主目录)示例~foo,~bar 到 /home/foo, /home/bar
> path.normalize('~mvaidya') '~mvaidya' > path.resolve('~mvaidya') '/home/mvaidya/~mvaidya' >这个反应是错误的;我希望 ~mvaidya 必须解析为 /home/mvaidya
【问题讨论】:
正如QZ Support 所述,您可以在 OSX/Linux 上使用process.env.HOME。这是一个没有依赖关系的简单函数。
const path = require('path');
function resolveHome(filepath) {
if (filepath[0] === '~') {
return path.join(process.env.HOME, filepath.slice(1));
}
return filepath;
}
【讨论】:
~foo 解析为/home/<current-user>/foo,而技术上它应该解析为/home/foo(至少在zsh 中)。
process.env.HOME,或许应该使用require('os').homedir()?
之所以不在 Node 中是因为 ~ 扩展是 bash(或 shell)特定的东西。目前尚不清楚如何正确逃避它。详情请见this comment。
有各种库提供此功能,大多数只需几行代码...
https://npm.im/untildify ;没有比os.homedir() 做的更多,见index.js#L10
https://npm.im/expand-tilde ;基本上都是用os-homedir来实现的,见index.js#L12
https://npm.im/tilde-expansion ;这使用了etc-passwd,所以看起来不是很跨平台,见index.js#L21
所以你可能想自己做。
【讨论】:
~ 是一个 bash-thing。
此 NodeJS 库通过异步回调支持此功能。它使用 etc-passswd 库来执行扩展,因此可能无法移植到 Windows 或其他非 Unix/Linux 平台。
如果您只想为当前用户扩展主页,那么这个更轻量级的 API 可能就是您所需要的。它也是同步的,因此使用起来更简单,并且适用于大多数平台。
示例:
expandHomeDir = require('expand-home-dir')
expandHomeDir('~')
// => /Users/azer
expandHomeDir('~/foo/bar/qux.corge')
// => /Users/azer/foo/bar/qux.corge
另一个相关的 lib 是 home-dir,它在任何平台上返回用户的主目录:
https://www.npmjs.org/package/home-dir
【讨论】:
process.env.HOME 似乎可以很好地代替其他帖子中提到的节点模块解决方案。例如~/somepath 可以是 process.env.HOME + '/somepath',但是警告......它不会解决 ~someuserhome/somepath 的原始问题,因为这需要链接模块解决方案。
一个例子:
const os = require("os");
"~/Dropbox/sample/music".replace("~", os.homedir)
【讨论】:
我今天只需要它,唯一不那么规避的命令是来自os 的命令。
$ node
> os.homedir()
'/Users/mdesales'
我不确定您的语法是否正确,因为 ~ 已经是当前用户主目录的结果
【讨论】:
这是以前的一些答案的组合,并添加了更多的安全性。
/**
* Resolves paths that start with a tilde to the user's home directory.
*
* @param {string} filePath '~/GitHub/Repo/file.png'
* @return {string} '/home/bob/GitHub/Repo/file.png'
*/
function resolveTilde (filePath) {
const os = require('os');
if (!filePath || typeof(filePath) !== 'string') {
return '';
}
// '~/folder/path' or '~' not '~alias/folder/path'
if (filePath.startsWith('~/') || filePath === '~') {
return filePath.replace('~', os.homedir());
}
return filePath;
}
os.homedir() 而不是process.env.HOME。os.homedir()。~/ 开头或只是~,以不替换其他别名,例如~stuff/。.slice(1)。【讨论】:
今天我用https://github.com/sindresorhus/untildify
我在 OSX 上运行,运行良好。
【讨论】: