一方面shell脚本量变大就会比较难以工程化,维护和阅读,另外一个重要的原因是shell不具备正经编程语言所具备的丰富的一些类库,比如说map类型必须得bash版本4.x以上才有,或者有序list什么的也没有...输出123 我们可以看到popen方法可以获取命令执行后到输入结果,但这还是有缺陷的,我们知道在linux里面,有标准的0,1,2来代表标准输入,输出和错误,现在只有stdout没有其他的两个变量还是有限制的...stderr 方式三:看到上面这些这么繁琐的调用,后面就又有了最强大的subprocess模块,subprocess模块的出现是用来替代OS模块中的system()和popen()方法的,官方推荐的是只用...wait(timeout): 等待子进程终止。communicate(input,timeout): 和子进程交互,发送和读取数据。send_signal(singnal): 发送信号到子进程 。...terminate(): 停止子进程,也就是发送SIGTERM信号到子进程。kill(): 杀死子进程。发送 SIGKILL 信号到子进程。
◆ 前言 最近在学习bash脚本语法,但是如果对bash语法不是熟手的话,感觉非常容易出错,比如说:显示未定义的变量shell中变量没有定义,仍然是可以使用的,但是它的结果可能不是你所预期的。...exec:启动一个子进程来执行命令,与spawn不同的是,它有一个回调函数能知道子进程的情况 execFile:启动一子进程来执行可执行文件 fork:与spawn类似,不同点是它需要指定子进程需要需执行的...., stdout:..., stderr:... } 的对象)。 # 否则,这将返回子进程对象,并且回调接收参数(代码、标准输出、标准错误)。...注意: __filename & __dirname这两个变量是在commonjs中的。我们用的是.mjs结尾的es6 模块。...在ESM模块中,Node.js 不提供__filename和 __dirname 全局变量。
前言 最近在学习bash脚本语法,但是如果对bash语法不是熟手的话,感觉非常容易出错,比如说:显示未定义的变量shell中变量没有定义,仍然是可以使用的,但是它的结果可能不是你所预期的。...exec:启动一个子进程来执行命令,与spawn不同的是,它有一个回调函数能知道子进程的情况 execFile:启动一子进程来执行可执行文件 fork:与spawn类似,不同点是它需要指定子进程需要需执行的...., stdout:..., stderr:... } 的对象)。 # 否则,这将返回子进程对象,并且回调接收参数(代码、标准输出、标准错误)。...注意: __filename & __dirname这两个变量是在commonjs中的。我们用的是.mjs结尾的es6 模块。...在ESM模块中,Node.js 不提供__filename和 __dirname 全局变量。
用法: os.popen(command[, mode[, bufsize]]) os.system(cmd) 或 os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容...在一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。在另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。...,NONE表示不进行重定向,继承父进程,PIPE表示创建管道 stdout 程序的标准输出句柄,参数意义同上 stderr 程序的标准错误句柄,参数意义同上,特殊,可以设置成STDOUT,表示与标准输出一致...3、Popen.communicate(input=None):与子进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。...同样,如果希望从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。 4、Popen.send_signal(signal):向子进程发送信号。
新建一个socket,并将0、1、2分别代表系统的stdin、stdout、stderr(标准输入、输出、错误)重定向到socket中,然后开启一个shell。...这样我们从socket中传来的命令就会进入系统的标准输入(就跟键盘输入的效果一样了),系统的输出和错误就会重定向到socket中,被我们客户端获取。...客户端连接上以后,就开启一个shell进程,然后把进程的标准输入输出错误(stdin、stdout、stderr)都重定向到管道中,通过管道和python程序连接,py中的subprocess库已为我们封装好了这个功能...,专门读取管道中的数据 4.不使用管道,直接把shell的输入输出定向到socket中。...直接在popen的时候,将新建进程的stdin、stdout、stderr都重定向到socket中。这样就可以不使用管道通信了。这也是C语言下零管道后门的原理。
cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。...cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。...两者的不同点在于: cmd >a 2>a 相当于使用了FD1、FD2两个互相竞争使用文件 a 的管道; cmd >a 2>&1 只使用了一个管道FD1,但已经包括了stdout和stderr。...在shell中,每个进程都和三个系统文件 相关联:标准输入stdin,标准输出stdout、标准错误stderr,三个系统文件的文件描述符分别为0,1、2。...linux shell 中"2>&1"含义脚本是: nohup /mnt/Nand3/H2000G >/dev/null 2>&1 & 对于&1 更准确的说应该是文件描述符 1,而1 一般代表的就是
脚本语言的缺点正在被逐步缩小。扯得有点远了。...subprocess模块中只定义了一个类: Popen。可以使用Popen来创建进程,并与进程进行复杂的交互。...他们可以是PIPE(数据管道),文件描述符或文件对象,也可以设置为None,表示从父进程继承。如果参数shell设为true,程序将通过shell来执行。...Popen.communicate(input=None) 与子进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。...同样,如果希望从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。 Popen.send_signal(signal) 向子进程发送信号。
以下是一个使用管道连接两个进程的例子: pythonCopy codeimport subprocess process1 = subprocess.Popen(['ls', '-l'], stdout...使用shell参数执行复杂命令 有时候,你可能需要执行包含管道、重定向和其他Shell功能的复杂命令。..., stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) 在这个例子中,subprocess.DEVNULL将子进程的标准输出和标准错误输出都重定向到空设备...使用subprocess.Popen的stdout和stderr参数进行输出流重定向 subprocess.Popen的stdout和stderr参数允许你将子进程的标准输出和标准错误输出重定向到文件或其他地方...结论 subprocess模块提供了多个函数和常量,用于更方便地执行子进程。通过灵活使用这些函数和常量,你可以满足不同的需求,从而更有效地管理和控制子进程。
如果run()函数被调用时指定 stderr=subprocess.STDOUT,那么stdout和stderr将会被整合到这一个属性中,且stderr将会为None stderr: 从子进程捕获的...需要说明的是,该方法在python3.x中才有。 call()方法启动的进程,其标准输入输出会绑定到父进程的输入和输出。调用程序无法获取命令的输出结果。...如通过为stdin, stdout和stderr传递不同的参数。 subprocess.Popen(): 在一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。...:发送数据到stdin,并从stdout和stderr读数据,直到收到EOF。...stdout python和shell是两个进程不能独立通信,必须通过操作系统提供的管道 用管道可以把结果存到stdin stdout stderr subprocess.popen('ifconfig
因为不是从当前进程中读取管道(pipe),如果子进程没有生成足够的输出来填充OS的管道缓冲区,可能会阻塞子进程。...因为不是从当前进程中读取管道(pipe),如果子进程没有生成足够的输出来填充OS的管道缓冲区,可能会阻塞子进程。...因为不是从当前进程中读取管道(pipe),如果子进程没有生成足够的输出来填充OS的管道缓冲区,可能会阻塞子进程。...为了避免该事件,使用communicate() Popen.communicate(input=None, timeout=None) 和process交互:发送数据到stdin,从stdout,stderr...函数返回一个元组(stdoutdata, stderrdata) 注意,如果想发送数据到进程管道,必须在创建Popen对象时使用stdin=PIPE,类似的如果想从结果元组中获取非None值数据,创建
python2.7 源码中的注释(由于能力有限,翻译的不太准确): 这个模块允许您开启进程、连接输入、输出和错误的管道,并获取他们的返回代码。...默认值为bufsize是0(无缓冲的)。 stdin、stdout和stderr分别指定执行程序的标准输入,标准输出和标准错误。有效值是PIPE,现有的文件描述符(正整数),现有文件对象,None。...PIPE创建一个新的子管道。None,没有重定向;子管道将会继承父管道的文件句柄。此外,标准错误可以用STDOUT来定义,表明应用程序应该从STDOUT捕获到相同的文件句柄的标准错误数据。...()在被调用过程中返回一个非零的返回码则会抛出‘CalledProcessError’ 安全 ============== 和其他popen函数不同,它不会隐式的执行/bin/sh,这意味着所有的字符,...这个属性是提供输入到子进程一个文件对象,否则为None stdout 如果stdout参数是PIPE , 这个属性是提供输出到子进程一个文件对象,否则为None stderr 如果stderr
'/not-exist': No such file or directory$ $ # stdout 和 stderr 重定向到不同文件$ ls /usr /not-exist > stdout.txt...&1,2 和 1 分别是 stderr 和 stdout,即将 stderr 重定向到 stdout。...cat foo.txtThis is line one.This is line two.EOF管道管道符号 |(英文名:pipeline)可以将多个命令串联起来,每一个进程的 stdout...作为下一个进程的 stdin,在 shell 中使用频率很高。...tee 命令tee 经常与管道组合起来使用,可在 stdout 正常输出的同时另外保存一份到文件。
stdin, stdout, stderr参数的特殊值,意味着使用管道重定向输入输出 subprocess.STDOUT:可传递给stderr参数的特殊值,表示重定向标准错误到标准输出 Popen 在一个新的进程中执行子程序...bufsize:创建stdin/stdout/stderr管道文件对象时作为对应的参数传递给open()函数。...子进程文件句柄继承自父进程。除此之外,stderr还可以是STDOUT,表示标准错误输出重定向到标准输出。 preexec_fn:限于POSIX系统,设置一个可调用对象,先于子进程中的程序执行。...communicate(input=None, timeout=None):进程交互:发送数据到stdin,读取stdout或stderr的数据知道读取到结束符。...类似的,返回的tuple如果希望是非None,需要设置stdout=PIPE和/或stderr=PIPE。
linux shell指令 shell是一种脚本语言, 需要有编译器执行 bash是linux下默认的shell sh是unix下默认的shell 在ubuntu中bash和sh都可用 执行.../test.sh 变量类型 局部变量 在脚本中定义, 仅在当前shell中有效, 其他shell不能访问 环境变量 所有程序, 包括shell启动的程序, 都能访问环境变量, 在c中通过system()...双引号的优点: 双引号里可以有变量 双引号里可以出现转义字符 shell的文件包含 Shell 也可以包含外部脚本,将外部脚本的内容合并到当前脚本 . filename #或 source filename...标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。...如果希望stderr重定向到file, 可以这样写, 在>前加2 command 2>file 标准错误文件 stdout 和 stderr 合并后重定向到 file command > file 2>
对于run()函数启动的进程,它的标准输入输出通道会绑定到父进程的输入输出。这说明调用程序无法捕获命令的输出。不过,我们可以通过为stdout和stderr参数传入PIPE来捕获输出,以备以后处理。...通过Shell返回消息 本例会通过一个子shell运行命令,在命令返回错误码并退出之前,将详细输入到控制台。...('gbk')) 运行之后,效果如下: 这里我们输入了一个错误的命令,可以看到因为命令错误,并没有输出命令的执行结果,0和64中间就是completed.stdout,为空。...这是因为我们设置了stdout与stderr为subprocess.PIPE,表明这些通道要开放。这样我们才能获取子shell运行的结果获取所运行的错误提示。...连接管道段 在Linux系统中,我们可以将多个命令连接成一个管线,即可以把它们的输入输出串联在一起。
在这一篇中,我们介绍了一点关于输入输出重定向和管道的基础知识,本篇将继续重定向的话题。 在开始前,先说一说shell中的引用。...(历史扩展,下篇叙述)只用在交互式shell中,脚本中无法进行历史记录和扩展。.../stdout exec 4>./stderr #转移标准输出到3号描述符,关闭原来的1号文件描述符。 exec 1>&3- #转移标准错误到4号描述符,关闭原来的2号文件描述符。.../test.sh 28653 命令的标准输出和标准输入通过双向管道分别连接到当前shell的两个文件描述符, 然后文件描述符又分别赋值给了数组元素NAME[0]和NAME[1] root bin daemon...匿名管道只能用于具有亲缘关系的进程之间。 命名管道可以用在两个不相关的进程之间,可以使用命令mknod或mkfifo来创建命名管道。
方法和变量 用途 os.getcwd() 获取当前工作目录,即当前 python 脚本工作的目录路径 os.chdir(“dirname”) 改变当前脚本工作目录;相当于 shell 下 cd os.curdir...模块主要用于创建子进程,并连接它们的输入、输出和错误管道,获取它们的返回状态。...必须是一个字符串,字符串参数列表 stdin、stdout 和 stderr:子进程的标准输入、输出和错误。...subprocess.PIPE 管道,可传递给 stdout、stdin 和 stderr 参数。...shell 参数组合比较复杂,根据命令的不同有不同的情况。
注意,close事件和exit事件是不同的,因为多个进程可能共享同一个stdio,所以发送exit事件并不一定会触发close事件。...ChildProcess中有几个标准流属性,分别是stderr,stdout,stdin和stdio。 stderr,stdout,stdin很好理解,分别是标准错误,标准输出和标准输入。...如果在通过stdio创建子进程的时候,这三个标准流被设置为除pipe之外的其他值,那么stdin,stdout和stderr将为null。...'pipe', // 把子进程的 stdout 通过管道传到父进程 。 fs.openSync('err.out', 'w') // 把子进程的 stderr 定向到一个文件。...(err); return; } console.log(stdout); }); // 文件名中包含空格的脚本: const bat = spawn('"my script.cmd"
从实际应用角度,如果我们希望使用多进程,让我们的应用支持并发执行,提升应用性能,那么首先要创建多进程,然后进程运行的过程中难免涉及到进程之间的通信,包括父子进程通信和兄弟进程之间的通信,另外还有很重要的一点是进程的管理...,并在shell上执行命令;spawn会在父子进程间建立IO流stdin、stdout、stderr;spawn返回一个子进程的引用,通过这个引用可以监听子进程状态,并接收子进程的输入流。...; } console.log(`stdout: ${stdout}`); console.error(`stderr: ${stderr}`);});execFile和exec不同的是,它不会创建一个...管道本质上就是内核中的一个缓存,当进程创建一个管道后,Linux会返回两个文件描述符,一个是写入端的描述符(fd1),一个是输出端的描述符(fd0),可以通过这两个描述符往管道写入或者读取数据。...NodeJS中也是通过net模块实现管道通信,与socket区别是server listen的和client connect的都是特定格式的管道名。管道的通信效率比较低下,一般不用它作为进程通信方案。
领取专属 10元无门槛券
手把手带您无忧上云