~ 不扩展到 phantomjs 脚本中的主目录

~ not expanding to home directory in phantomjs script

我有两个脚本。第一个是基本的 bash 脚本,称为 tfile:

#!/bin/bash
logger -s "About to try running phantomjs"
logger -s "Current User: "$USER
VAR=$(phantomjs ~/test/phtest.js)
logger -s $VAR
logger -s "Finished running phantomjs"

第二个是phantomjs脚本,phtest.js:

var fs = require('fs');
console.log("It worked!" + fs.workingDirectory);
fs.write("~/test/testlog.txt","It worked!","w");
phantom.exit();

如果我从命令行 运行 脚本 tfile,一切正常。它将用户记录为我,phtest 将工作目录输出为 /Users/myname/test。

现在,我在 ~/Library/LaunchAgents 中设置了一个 launchd 文件,每当某个文件发生更改时,它 运行s tfile。当我更改该文件时,tfile 运行 的前两行给我与以前完全相同的输出,phantomjs 进程启动,但随后挂起。如果我终止进程,我得到输出:

It worked! / Unable to open file '~/test/testlog.txt' :78 in open :135 in write

我认为这意味着 phantomjs 运行在位置 /,而不是像以前一样从我的主目录。

如果我硬编码我的主目录而不是在 phtest 中使用 ~,那么它不再挂起,但 phantomjs 的输出仍然是 /。

所以我的问题是:为什么 ~ 在 tfile 中扩展,无论我如何 运行 它,但在 phtest 中却没有?我知道 ~ 是 shell 的一个特性,而不是文件系统,但由于在这两种情况下 phtest 都是从 bash 脚本调用的,我不确定为什么扩展发生在一个实例,但不是另一个。

不同之处在于 ~ 不会在双引号内展开。它被视为引号内的文字值,而不是扩展到主目录。

您可以使用 $HOME 代替 ~

POSIX description 状态:

Enclosing characters in double-quotes ( "" ) shall preserve the literal value of all characters within the double-quotes, with the exception of the characters backquote, dollar-sign and backslash.

~ 在将在双引号内扩展的字符列表中。您可以轻松测试它:

$cd ~
$touch test_file
$ls test_file 
test_file
$ls "~/test_file"
ls: cannot access ~/test_file: No such file or directory
$ls ~/test_file
/home/usr/test_file
$