Phonegap CLI 从 SSH 会话而不是从 bash 脚本运行
Phonegap CLI runs from SSH session but not from bash script
我正在设置 Ubuntu 14.04 服务器以使用 Phonegap CLI 自动构建混合 Android 应用程序。写完所有相关脚本后,我 运行 遇到了一个相当困难的 运行ge 问题 - 当我通过 SSH 连接到我的服务器时,我可以 运行 脚本和 运行 所有 Phonegap 命令在我的互动 shell 会话中成功。但是,每次尝试 运行 自动脚本中的那些相同命令都会被其他一些(访问者生成的)事件触发,但都失败了。为了确定问题所在,我将其简化为一个简单的实验,概述如下。
第一步 - 编写启动脚本,pgtest
in /etc/init.d
#! /bin/bash
source ~/.nvm/nvm.sh;
nvm use stable;
cd /home;
ls >> /tmp/ls;
which node >> /tmp/node;
which git >> /tmp/git;
which phonegap >> /tmp/pgp;
phonegap -v >> /tmp/pgpv 2>/tmp/pgpe;
说明
- 我使用 NVM 来管理节点,所以我确保系统知道在哪里可以找到 nvm.sh
- 我正在启动 NVM 以使用 Node + NPM 的稳定 (4.1.1.) 版本
- 我想确保我的批处理文件确实在执行,所以我
ls /home
并将其输出通过管道传输到 /tmp/ls
文件。
- 我想确保节点、git 和 phonegap 实际上可用,所以我将
which node|git|phonegap
的输出通过管道传输到 /tmp
文件夹中的文件。
- 没有必要使事情复杂化,所以我发出了最简单的 Phonegap 命令,
phonegap -v
来报告当前版本号。执行此操作时可能发生的任何错误都将通过管道传输到文件 /tmp/pgpe
.
第 2 步 - 确保 pgtest
是 运行 最后一个
ln -s /etc/init.d/pgtest /etc/rc2.d/S04PGTest
说明 - 我只希望这个脚本 运行 在我服务器上的其他所有内容 有机会启动
所有这些都准备就绪后,我通过服务器重新启动并检查了 /tmp
文件夹的内容。我的发现
ls
- /home
文件夹的文件夹列表存在且正确。
node
、git
和pgp
指向Node的位置,Git和Phonegap
pgpv
,应该包含 Phonegap 版本号,是 EMPTY
pgpe
存在并且 NOT 为空
最后的意思是 系统 在尝试执行 phonegap -v
时遇到错误。以下是pgpe
.
的内容
path.js:8
throw new TypeError('Path must be a string. Received ' +
^
TypeError: Path must be a string. Received undefined
at assertPath (path.js:8:11)
at Object.posix.join (path.js:477:5)
at Object.
(/root/.nvm/versions/node/v4.1.1/lib/node_modules/phonegap/node_modules/phonegap-build/lib/common/config/global.js:17:28)
at Module._compile (module.js:434:26)
at Object.Module._extensions..js (module.js:452:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object.
(/root/.nvm/versions/node/v4.1.1/lib/node_modules/phonegap/node_modules/phonegap-build/lib/common/config.js:9:13)
奇怪的是。如果我清除 /tmp
文件夹并在交互式 shell 会话中发出 /etc/init.d/pgtest
,我会得到以下结果
/tmp/ls
与以前一样显示并填充了 /home
文件夹列表
/tmp/node
, /tmp/git
/tmp/pgp
存在并正确
/tmp/pgpv
报告5.3.6
- 当前Phonegap版本号
/tmp/pgpe
是 EMPTY ,即没有报告错误
很明显,交互式 bash shell 环境有些东西在我 运行 自动脚本时不存在 - 在这种情况下是在启动时,但它也会在我触发以任何其他方式通过自动脚本处理。
通过所有这些,我离查明问题的原因越来越近了。然而,我对这些系统如何工作的了解让我失望了。交互式 shell 环境与我的自动脚本遇到的环境有何区别?我该如何解释 /tmp/pgpe
中报告的错误?我该怎么做才能修复它们?
如果有人能帮助我走上正轨,我将不胜感激。
根据@Eduardo 的建议进行编辑。我抓取了两组环境(交互式和 init.d)。可以在 this fiddle 中找到进行 DIFF(交互式 vs init.d)的结果。下面显示了一个不太容易访问的 DIFF 结果转储
--- /home/env.inter 2015-11-11 08:30:40.314172560 +0000
+++ /home/env.auto 2015-11-11 08:32:55.240906000 +0000
@@ -1,48 +1,38 @@
BASH=/bin/bash
BASHOPTS=cmdhist:complete_fullquote:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
-BASH_ARGC=()
-BASH_ARGV=()
+BASH_ARGC=([0]="1")
+BASH_ARGV=([0]="start")
BASH_CMDS=()
BASH_LINENO=([0]="0")
-BASH_SOURCE=([0]="/etc/init.d/pgtest")
+BASH_SOURCE=([0]="/etc/rc2.d/S04pgtest")
BASH_VERSINFO=([0]="4" 1="3" [2]="11" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='4.3.11(1)-release'
DIRSTACK=()
EUID=0
GROUPS=()
-HOME=/root
HOSTNAME=example.com
HOSTTYPE=x86_64
IFS=$' \t\n'
-LANG=en_US.UTF-8
-LESSCLOSE='/usr/bin/lesspipe %s %s'
-LESSOPEN='| /usr/bin/lesspipe %s'
-LOGNAME=root
-LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:.tar=01;31:.tgz=01;31:.arj=01;31:.taz=01;31:.lzh=01;31:.lzma=01;31:.tlz=01;31:.txz=01;31:.zip=01;31:.z=01;31:.Z=01;31:.dz=01;31:.gz=01;31:.lz=01;31:.xz=01;31:.bz2=01;31:.bz=01;31:.tbz=01;31:.tbz2=01;31:.tz=01;31:.deb=01;31:.rpm=01;31:.jar=01;31:.war=01;31:.ear=01;31:.sar=01;31:.rar=01;31:.ace=01;31:.zoo=01;31:.cpio=01;31:.7z=01;31:.rz=01;31:.jpg=01;35:.jpeg=01;35:.gif=01;35:.bmp=01;35:.pbm=01;35:.pgm=01;35:.ppm=01;35:.tga=01;35:.xbm=01;35:.xpm=01;35:.tif=01;35:.tiff=01;35:.png=01;35:.svg=01;35:.svgz=01;35:.mng=01;35:.pcx=01;35:.mov=01;35:.mpg=01;35:.mpeg=01;35:.m2v=01;35:.mkv=01;35:.webm=01;35:.ogm=01;35:.mp4=01;35:.m4v=01;35:.mp4v=01;35:.vob=01;35:.qt=01;35:.nuv=01;35:.wmv=01;35:.asf=01;35:.rm=01;35:.rmvb=01;35:.flc=01;35:.avi=01;35:.fli=01;35:.flv=01;35:.gl=01;35:.dl=01;35:.xcf=01;35:.xwd=01;35:.yuv=01;35:.cgm=01;35:.emf=01;35:.axv=01;35:.anx=01;35:.ogv=01;35:.ogx=01;35:.aac=00;36:.au=00;36:.flac=00;36:.mid=00;36:.midi=00;36:.mka=00;36:.mp3=00;36:.mpc=00;36:.ogg=00;36:.ra=00;36:.wav=00;36:.axa=00;36:.oga=00;36:.spx=00;36:.xspf=00;36:'
MACHTYPE=x86_64-pc-linux-gnu
-MAIL=/var/mail/root
-NVM_DIR=/root/.nvm
-NVM_IOJS_ORG_MIRROR=https://iojs.org/dist
-NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist
-NVM_RC_VERSION=
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
-PATH=/opt/android/platform-tools:/opt/android/tools:/opt/android:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
+PATH=/sbin:/usr/sbin:/bin:/usr/bin
PIPESTATUS=([0]="0")
-PPID=4801
+PPID=911
+PREVLEVEL=N
PS4='+ '
-PWD=/etc/init.d
+PWD=/
+RUNLEVEL=2
SHELL=/bin/bash
SHELLOPTS=braceexpand:hashall:interactive-comments
-SHLVL=3
-SSH_CLIENT='nn.nn.nn.nn nnnn nnnn'
-SSH_CONNECTION='nn.nn.nn.nn nnnn nn.nn.nn.nn nnnn'
-SSH_TTY=/dev/pts/0
-TERM=xterm
+SHLVL=1
+TERM=linux
UID=0
-USER=root
-XDG_RUNTIME_DIR=/run/user/1000
-XDG_SESSION_ID=5
+UPSTART_EVENTS=runlevel
+UPSTART_INSTANCE=
+UPSTART_JOB=rc
_=n
+previous=N
+runlevel=2
我在这里所做的唯一更改 - 屏蔽了主机名和 SSH 客户端 IP 地址。
我很确定在发布这个问题之前我已经在自己的实验中尝试过这个但是按照下面@Eduardo 的建议我尝试坚持
EXPORT PATH=/opt/android/platform-tools:/opt/android/tools:/opt/android:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
在脚本顶部 - source ~/.nvm...
行下方。稍后重新启动,结果仍然相同:空的 /tmp/pgpv
和 /tmp/pgpe
.
中报告的相同错误
只需确保将脚本中的 PATH 变量设置为您在 diff 上看到的相同的、更长的变量,然后重试自动化。
我可能还会定义 HOME 和 NVM* 变量。作为测试,我会在 phonegap 的同一目录中创建一个 test.sh 脚本,内容如下:
#!/bin/bash
set > /tmp/env_vars.log
并将您的脚本设为:
#!/bin/bash
export TERM=linux
export USER=root
export HOME=/root
export NVM_DIR=/root/.nvm
export NVM_IOJS_ORG_MIRROR=https://iojs.org/dist
export NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist
export NVM_RC_VERSION=
export PATH=/opt/android/platform-tools:/opt/android/tools:/opt/android:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
source ~/.nvm/nvm.sh
nvm use stable
cd /home
ls > /tmp/ls
which node > /tmp/node
which git > /tmp/git
which phonegap > /tmp/pgp
phonegap -v > /tmp/pgpv 2>/tmp/pgpe;
test.sh
我正在设置 Ubuntu 14.04 服务器以使用 Phonegap CLI 自动构建混合 Android 应用程序。写完所有相关脚本后,我 运行 遇到了一个相当困难的 运行ge 问题 - 当我通过 SSH 连接到我的服务器时,我可以 运行 脚本和 运行 所有 Phonegap 命令在我的互动 shell 会话中成功。但是,每次尝试 运行 自动脚本中的那些相同命令都会被其他一些(访问者生成的)事件触发,但都失败了。为了确定问题所在,我将其简化为一个简单的实验,概述如下。
第一步 - 编写启动脚本,pgtest
in /etc/init.d
#! /bin/bash
source ~/.nvm/nvm.sh;
nvm use stable;
cd /home;
ls >> /tmp/ls;
which node >> /tmp/node;
which git >> /tmp/git;
which phonegap >> /tmp/pgp;
phonegap -v >> /tmp/pgpv 2>/tmp/pgpe;
说明
- 我使用 NVM 来管理节点,所以我确保系统知道在哪里可以找到 nvm.sh
- 我正在启动 NVM 以使用 Node + NPM 的稳定 (4.1.1.) 版本
- 我想确保我的批处理文件确实在执行,所以我
ls /home
并将其输出通过管道传输到/tmp/ls
文件。 - 我想确保节点、git 和 phonegap 实际上可用,所以我将
which node|git|phonegap
的输出通过管道传输到/tmp
文件夹中的文件。 - 没有必要使事情复杂化,所以我发出了最简单的 Phonegap 命令,
phonegap -v
来报告当前版本号。执行此操作时可能发生的任何错误都将通过管道传输到文件/tmp/pgpe
.
第 2 步 - 确保 pgtest
是 运行 最后一个
ln -s /etc/init.d/pgtest /etc/rc2.d/S04PGTest
说明 - 我只希望这个脚本 运行 在我服务器上的其他所有内容 有机会启动
所有这些都准备就绪后,我通过服务器重新启动并检查了 /tmp
文件夹的内容。我的发现
ls
-/home
文件夹的文件夹列表存在且正确。node
、git
和pgp
指向Node的位置,Git和Phonegappgpv
,应该包含 Phonegap 版本号,是 EMPTYpgpe
存在并且 NOT 为空
最后的意思是 系统 在尝试执行 phonegap -v
时遇到错误。以下是pgpe
.
path.js:8
throw new TypeError('Path must be a string. Received ' +
^
TypeError: Path must be a string. Received undefined
at assertPath (path.js:8:11)
at Object.posix.join (path.js:477:5)
at Object.
(/root/.nvm/versions/node/v4.1.1/lib/node_modules/phonegap/node_modules/phonegap-build/lib/common/config/global.js:17:28)
at Module._compile (module.js:434:26)
at Object.Module._extensions..js (module.js:452:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object. (/root/.nvm/versions/node/v4.1.1/lib/node_modules/phonegap/node_modules/phonegap-build/lib/common/config.js:9:13)
奇怪的是。如果我清除 /tmp
文件夹并在交互式 shell 会话中发出 /etc/init.d/pgtest
,我会得到以下结果
/tmp/ls
与以前一样显示并填充了/home
文件夹列表/tmp/node
,/tmp/git
/tmp/pgp
存在并正确/tmp/pgpv
报告5.3.6
- 当前Phonegap版本号/tmp/pgpe
是 EMPTY ,即没有报告错误
很明显,交互式 bash shell 环境有些东西在我 运行 自动脚本时不存在 - 在这种情况下是在启动时,但它也会在我触发以任何其他方式通过自动脚本处理。
通过所有这些,我离查明问题的原因越来越近了。然而,我对这些系统如何工作的了解让我失望了。交互式 shell 环境与我的自动脚本遇到的环境有何区别?我该如何解释 /tmp/pgpe
中报告的错误?我该怎么做才能修复它们?
如果有人能帮助我走上正轨,我将不胜感激。
根据@Eduardo 的建议进行编辑。我抓取了两组环境(交互式和 init.d)。可以在 this fiddle 中找到进行 DIFF(交互式 vs init.d)的结果。下面显示了一个不太容易访问的 DIFF 结果转储
--- /home/env.inter 2015-11-11 08:30:40.314172560 +0000 +++ /home/env.auto 2015-11-11 08:32:55.240906000 +0000 @@ -1,48 +1,38 @@ BASH=/bin/bash BASHOPTS=cmdhist:complete_fullquote:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() -BASH_ARGC=() -BASH_ARGV=() +BASH_ARGC=([0]="1") +BASH_ARGV=([0]="start") BASH_CMDS=() BASH_LINENO=([0]="0") -BASH_SOURCE=([0]="/etc/init.d/pgtest") +BASH_SOURCE=([0]="/etc/rc2.d/S04pgtest") BASH_VERSINFO=([0]="4" 1="3" [2]="11" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu") BASH_VERSION='4.3.11(1)-release' DIRSTACK=() EUID=0 GROUPS=() -HOME=/root HOSTNAME=example.com HOSTTYPE=x86_64 IFS=$' \t\n' -LANG=en_US.UTF-8 -LESSCLOSE='/usr/bin/lesspipe %s %s' -LESSOPEN='| /usr/bin/lesspipe %s' -LOGNAME=root -LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:.tar=01;31:.tgz=01;31:.arj=01;31:.taz=01;31:.lzh=01;31:.lzma=01;31:.tlz=01;31:.txz=01;31:.zip=01;31:.z=01;31:.Z=01;31:.dz=01;31:.gz=01;31:.lz=01;31:.xz=01;31:.bz2=01;31:.bz=01;31:.tbz=01;31:.tbz2=01;31:.tz=01;31:.deb=01;31:.rpm=01;31:.jar=01;31:.war=01;31:.ear=01;31:.sar=01;31:.rar=01;31:.ace=01;31:.zoo=01;31:.cpio=01;31:.7z=01;31:.rz=01;31:.jpg=01;35:.jpeg=01;35:.gif=01;35:.bmp=01;35:.pbm=01;35:.pgm=01;35:.ppm=01;35:.tga=01;35:.xbm=01;35:.xpm=01;35:.tif=01;35:.tiff=01;35:.png=01;35:.svg=01;35:.svgz=01;35:.mng=01;35:.pcx=01;35:.mov=01;35:.mpg=01;35:.mpeg=01;35:.m2v=01;35:.mkv=01;35:.webm=01;35:.ogm=01;35:.mp4=01;35:.m4v=01;35:.mp4v=01;35:.vob=01;35:.qt=01;35:.nuv=01;35:.wmv=01;35:.asf=01;35:.rm=01;35:.rmvb=01;35:.flc=01;35:.avi=01;35:.fli=01;35:.flv=01;35:.gl=01;35:.dl=01;35:.xcf=01;35:.xwd=01;35:.yuv=01;35:.cgm=01;35:.emf=01;35:.axv=01;35:.anx=01;35:.ogv=01;35:.ogx=01;35:.aac=00;36:.au=00;36:.flac=00;36:.mid=00;36:.midi=00;36:.mka=00;36:.mp3=00;36:.mpc=00;36:.ogg=00;36:.ra=00;36:.wav=00;36:.axa=00;36:.oga=00;36:.spx=00;36:.xspf=00;36:' MACHTYPE=x86_64-pc-linux-gnu -MAIL=/var/mail/root -NVM_DIR=/root/.nvm -NVM_IOJS_ORG_MIRROR=https://iojs.org/dist -NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist -NVM_RC_VERSION= OPTERR=1 OPTIND=1 OSTYPE=linux-gnu -PATH=/opt/android/platform-tools:/opt/android/tools:/opt/android:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games +PATH=/sbin:/usr/sbin:/bin:/usr/bin PIPESTATUS=([0]="0") -PPID=4801 +PPID=911 +PREVLEVEL=N PS4='+ ' -PWD=/etc/init.d +PWD=/ +RUNLEVEL=2 SHELL=/bin/bash SHELLOPTS=braceexpand:hashall:interactive-comments -SHLVL=3 -SSH_CLIENT='nn.nn.nn.nn nnnn nnnn' -SSH_CONNECTION='nn.nn.nn.nn nnnn nn.nn.nn.nn nnnn' -SSH_TTY=/dev/pts/0 -TERM=xterm +SHLVL=1 +TERM=linux UID=0 -USER=root -XDG_RUNTIME_DIR=/run/user/1000 -XDG_SESSION_ID=5 +UPSTART_EVENTS=runlevel +UPSTART_INSTANCE= +UPSTART_JOB=rc _=n +previous=N +runlevel=2
我在这里所做的唯一更改 - 屏蔽了主机名和 SSH 客户端 IP 地址。
我很确定在发布这个问题之前我已经在自己的实验中尝试过这个但是按照下面@Eduardo 的建议我尝试坚持
EXPORT PATH=/opt/android/platform-tools:/opt/android/tools:/opt/android:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
在脚本顶部 - source ~/.nvm...
行下方。稍后重新启动,结果仍然相同:空的 /tmp/pgpv
和 /tmp/pgpe
.
只需确保将脚本中的 PATH 变量设置为您在 diff 上看到的相同的、更长的变量,然后重试自动化。
我可能还会定义 HOME 和 NVM* 变量。作为测试,我会在 phonegap 的同一目录中创建一个 test.sh 脚本,内容如下:
#!/bin/bash
set > /tmp/env_vars.log
并将您的脚本设为:
#!/bin/bash
export TERM=linux
export USER=root
export HOME=/root
export NVM_DIR=/root/.nvm
export NVM_IOJS_ORG_MIRROR=https://iojs.org/dist
export NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist
export NVM_RC_VERSION=
export PATH=/opt/android/platform-tools:/opt/android/tools:/opt/android:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
source ~/.nvm/nvm.sh
nvm use stable
cd /home
ls > /tmp/ls
which node > /tmp/node
which git > /tmp/git
which phonegap > /tmp/pgp
phonegap -v > /tmp/pgpv 2>/tmp/pgpe;
test.sh