gpt4 book ai didi

node.js - 通过Node.js子进程区分bash和sh

转载 作者:太空宇宙 更新时间:2023-11-04 10:27:36 25 4
gpt4 key购买 nike

我使用 bashsh 启动 Node.js 的子进程,如下所示:

const file = '<some-path>.sh';  
const cp = require('child_process');

//sh
const n = cp.spawn('sh',[file]);

//bash
const n = cp.spawn('bash',[file]);

我遇到的问题是,文件系统上经常会有 .sh 文件实际上只能由 bash 解释

即使说 .sh 文件有以下 hashbang

#!/usr/bin/env bash

如果我明确地使用 sh 启动进程,那么脚本将使用 sh 而不是 bash 执行,然后将出现错误由 sh 提出。

例如,read -u 命令是一个 bash 实用程序,而不是 sh。

问题通常在 shell 中通过使用 hashbang 并运行如下脚本来解决:

./<some-path>.sh

但是,在 Node.js 中,我必须选择是使用 sh 还是 bash,而且我事先不知道它是什么类型的脚本!

我是否应该为 sh 文件强制执行 .sh 的文件扩展名约定,为 bash 脚本强制执行 .bash 的文件扩展名约定?

或者有没有办法让 Node.js 启动一个“较低级别的内核进程”而不是 sh 或 bash 来评估 shell 脚本以确定是使用 bash 还是 sh?

最佳答案

经过更多研究,我认为 exec 命令就是我要找的命令:

https://linux.die.net/man/3/exec

但是当我这样使用它时,我得到了一个错误。

 const n = cp.spawn('exec', ['file.sh']);

错误如下:

 Error: spawn exec ENOENT
at exports._errnoException (util.js:1022:11)
at Process.ChildProcess._handle.onexit (internal/child_process.js:193:32)
at onErrorNT (internal/child_process.js:359:16)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickDomainCallback (internal/process/next_tick.js:122:9)

错误起源于此:

n.on('error', function (err) {
console.error('\n',err.stack || err,'\n'); // here
});

但是,这似乎有效!

首先,使用以下命令确保 shell 脚本可执行:

chmod u+x <file.sh>

然后我们可以这样执行:

const n = cp.spawn('/absolute/path/to/file.sh');

这将调用由 hashbang 确定的正确解释器,例如:

#!/usr/bin/env bash

瞧!

关于node.js - 通过Node.js子进程区分bash和sh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41067872/

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