我有以下简单的gulpfile.js
脚本:
var gulp = require('gulp');
var shell = require('gulp-shell');
gulp.task('run-me', shell.task([
'export sweet_param=5',
'echo $sweet_param'
]));
问题是$sweet_param
变量没有打印出来。
在 Windows 8.1 的 Git Bash 下运行时,它会失败并显示以下消息:
[16:51:06] Starting 'run-me'...
'export' is not recognized as an internal or external command,
operable program or batch file.
[16:51:06] 'run-me' errored after 29 ms
[16:51:06] Error in plugin 'gulp-shell'
Message:
Command `export sweet_param=5` failed with exit code 1
在 Linux 的情况下,任务执行没有错误,但打印的是空行而不是预期值:
[16:49:32] Starting 'run-me'...
[16:49:32] Finished 'run-me' after 26 ms
如果在两个操作系统上以 bash 手动执行任务中的命令,则会成功回显5
。
使用的软件:
- 咕噜咕噜 3.8.11
- 吞噬壳 0.4.1
- 节点.js v0.12.2
- bash版本3.1.20(4)发布(i686-pc-msys)在Windows上
- Linux 上的 bash 版本 4.3.33(1)-release (x86_64-unknown-linux-gnu)。
这里有什么收获?
谢谢!
Bash 只允许环境变量存在于一个 bash 会话期间。当您键入时
export sweet_param=5
只要 bash 开放,sweet_param
就存在。合上你的壳,sweet_param
就不见了。
gulp-shell
每行都接受一个命令,但对于每一行,它会启动另一个 bash:打开 bash>>执行行>>终止 bash>>下一个。因此,在您拥有的每一行之后,所有先前设置的参数都消失了。
尝试:
gulp.task('run-me', shell.task([
'export sweet_param=5 && echo $sweet_param'
]));
以查看如果所有执行都在一行中,则参数将保持不变。
为了把它写得更漂亮一点,你可以使用这样的东西:
gulp.task('run-me', shell.task([
'export sweet_param=5',
'echo $sweet_param'
].join(' && '));
至于Win的问题:Git bash仍然不是Unix shell。你应该尝试Cygwin或配偶来做到这一点。