加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

(…)和{…}如何在bash中使用管道与子shell创建交互?

发布时间:2020-12-15 17:03:13 所属栏目:安全 来源:网络整理
导读:我试图理解使用圆括号和大括号的 shell子进程调用之间的区别.我认为大括号不会启动子进程,但似乎它们确实启动了一个子进程. #!/bin/sha=1b=1( a=2; ) | ( a=3; ){ b=2; } | { b=3; }echo "a=$a"echo "b=$b" 打印此脚本 a=1b=1 所以似乎所有调用都在子进程内
我试图理解使用圆括号和大括号的 shell子进程调用之间的区别.我认为大括号不会启动子进程,但似乎它们确实启动了一个子进程.
#!/bin/sh

a=1
b=1

( a=2; ) | ( a=3; )
{ b=2; } | { b=3; }

echo "a=$a"
echo "b=$b"

打印此脚本

a=1
b=1

所以似乎所有调用都在子进程内运行.在这种背景下他们之间有什么区别吗?我明白,如果我使用&&和||,然后{..}将不会启动子进程,但我试图了解管道是如何工作的.

为了证明它是生成子shell的管道本身,并且花括号不会改变这种方式:
#!/bin/bash

echo "Base: $BASHPID"
( echo "In (): $BASHPID" )   # This will differ from the base
{ echo "In {}: $BASHPID"; }  # This will match the base

# In bash,these will both differ from the base
echo "Pipeline,default config:"
{ echo " X: $BASHPID" >&2; } | { echo " Y: $BASHPID" >&2; }

# This is exactly the same without the {}s
echo "Pipeline,no {}s,default config:"
echo " X: $BASHPID" >&2 | echo " Y: $BASHPID" >&2

# Only the former will differ from the base if running a new enough bash
shopt -s lastpipe
echo "Pipeline,lastpipe enabled:"
{ echo " X: $BASHPID" >&2; } | { echo " Y: $BASHPID" >&2; }

使用bash 4.3在本地运行,我得到:

Base: 82811
In (): 82812
In {}: 82811
Pipeline,default config:
 X: 82813
 Y: 82814
Pipeline,default config:
 X: 82815
 Y: 82816
Pipeline,lastpipe enabled:
 Y: 82811
 X: 82817

请注意,由于所有管道组件同时运行,因此没有定义的排序,其中X或Y将首先发出输出;但是,在启用了lastpipe的情况下,最后一个管道组件在已经启动并运行的shell中调用(不需要从主进程中删除fork()),这稍微修改了谁首先写入stdout的可能性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读