gpt4 book ai didi

bash - Phonegap CLI从SSH session 运行,但不是从bash脚本运行

转载 作者:行者123 更新时间:2023-12-02 10:06:41 26 4
gpt4 key购买 nike

我正在设置Ubuntu 14.04服务器,以使用Phonegap CLI自动执行混合Android应用程序构建。编写完所有相关脚本后,我遇到了一个非常奇怪的问题-当我SSH进入服务器时,我可以在交互式Shell会话中运行脚本并成功运行所有Phonegap命令。但是,每次在自动化脚本中运行这些命令的尝试均会被其他(访客生成)事件触发而失败。为了解决这个问题,我将其简化为一个简单的实验,下面将对此进行概述。

步骤1-在pgtest中编写一个启动脚本/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来管理Node,所以我要确保系统知道在哪里可以找到nvm.sh。
我启动NVM以使用稳定的(4.1.1。)版本的Node + NPM
我要确保批处理文件实际上正在执行,所以我要执行 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文件夹的文件夹列表。
nodegitpgp指向Node,Git和Phonegap的位置
pgpv(应包含Phonegap版本号)为EMPTY
pgpe存在且不为空


最后一个暗示着系统在尝试执行 phonegap -v时遇到错误。这是 pgpe的内容。


path.js:8

抛出新的TypeError('Path必须是字符串。收到的'+

^

TypeError:路径必须是字符串。收到未定义

在assertPath(path.js:8:11)

在Object.posix.join(path.js:477:5)

在对象。

(/root/.nvm/versions/node/v4.1.1/lib/node_modules/phonegap/node_modules/phonegap-build/lib/common/config/global.js:17:28)

在Module._compile(module.js:434:26)

在Object.Module._extensions..js(module.js:452:10)

在Module.load(module.js:355:32)

在Function.Module._load(module.js:310:12)

在Module.require(module.js:365:17)

在需要时(module.js:384:17)

在对象。
(/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环境在运行自动化脚本时不存在某些东西-在这种情况下,在启动时会发生这种情况,但当我通过自动化脚本以任何其他方式触发该过程时,也会发生这种情况。

有了所有这些,我正在接近确定问题的原因。但是,我对这些系统如何工作的了解让我失望。交互式外壳程序环境与我的自动化脚本遇到的环境有什么区别?我该如何解释 /tmp/pgpe中报告的错误?我该如何解决?

我将对任何能够将我带入正确道路的人表示感谢。



根据@Eduardo的建议进行编辑。我抓住了两组环境(interactive和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] =“开始”)
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] =“版本” [5] =“ x86_64-pc-linux-gnu ”)
BASH_VERSION ='4.3.11(1)-发布'
DIRSTACK =()
EUID = 0
组=()
-HOME = / root
HOSTNAME = example.com
主机类型= x86_64
IFS = $'\ t \ n'
-LANG = zh_CN.UTF-8
-LESSCLOSE ='/ usr / bin / lesspipe%s%s'
-LESSOPEN ='| / usr / bin / lesspipe%s'
-LOGNAME =根
-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:.em f = 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
外壳= / 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 =根
-XDG_RUNTIME_DIR = /运行/用户/ 1000
-XDG_SESSION_ID = 5
+ UPSTART_EVENTS =运行级别
+ UPSTART_INSTANCE =
+ UPSTART_JOB = rc
_ = n
+上一个= N
+运行级别= 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

关于bash - Phonegap CLI从SSH session 运行,但不是从bash脚本运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33495497/

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