【问题标题】:nodeJS exec does not work for "cd " shell cmdnodeJS exec 不适用于“cd” shell cmd
【发布时间】:2013-03-15 19:50:15
【问题描述】:
var sys = require('sys'),
    exec = require('child_process').exec;

exec("cd /home/ubuntu/distro", function(err, stdout, stderr) {
        console.log("cd: " + err + " : "  + stdout);
        exec("pwd", function(err, stdout, stderr) {
            console.log("pwd: " + err + " : " + stdout);
            exec("git status", function(err, stdout, stderr) {
                console.log("git status returned " ); console.log(err);
            })
        })
    })

cd: null :

pwd: null : /

git status returned 
{ [Error: Command failed: fatal: Not a git repository (or any of the parent directories): .git ] killed: false, code: 128, signal: null }

nodeJS exec 不适用于“cd”shell cmd。正如您在下面看到的, pwd 有效, git status 正在尝试工作但失败,因为它没有在 git 目录中执行,但是 cd cmd 无法阻止其他 cmd 的进一步成功执行。 在 nodeJS shell 以及 nodeJS+ExpressJS 网络服务器中尝试过。

【问题讨论】:

    标签: javascript node.js express exec


    【解决方案1】:

    而不是多次调用 exec()。对多个命令调用一次 exec()

    您的 shell 正在执行 cd 但只是每个 shell 在完成后都会丢弃它的工作目录。因此,您又回到了第一方。

    在您的情况下,您不需要多次调用 exec() 。您可以确保您的 cmd 变量包含多条指令,而不是 1 条。CD 在这种情况下工作。

    var cmd =  `ls
    cd foo
    ls`
    
    var exec =  require('child_process').exec;
    
    exec(cmd, function(err, stdout, stderr) {
            console.log(stdout);
    })
    

    注意:此代码应在Linux 但不适用于Windows。见here

    【讨论】:

      【解决方案2】:

      它正在工作。但随后它就把壳扔掉了。 Node 为每个 exec 创建一个新的 shell。

      以下选项可以提供帮助:http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

      【讨论】:

        【解决方案3】:

        每个命令都在一个单独的 shell 中执行,所以第一个 cd 只影响那个 shell 进程,然后终止。如果您想在特定目录中运行 git,只需让 Node 为您设置路径即可:

        exec('git status', {cwd: '/home/ubuntu/distro'}, /* ... */);
        

        cwd(当前工作目录)是many options available for exec之一。

        【讨论】:

        • 看起来不起作用:我执行另一个 .sh 文件,在这个 .sh 文件中我有'node ./myscript,js'并给出'找不到模块'显示原始路径,而不是'cwd' 中给出的路径
        • @stackdave:这应该可行。如果你不能让它工作,你可以打开另一个问题,提供更多关于你具体做什么的信息,最好用一小组短文件来重现它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-05
        • 2011-03-28
        • 2018-11-06
        • 2017-11-17
        • 1970-01-01
        • 2016-11-03
        • 1970-01-01
        相关资源
        最近更新 更多