shell内置重定向

时间:2016-09-02 13:19:17

标签: shell unix

我们正在开发一个shell(学校项目)。我们不了解某种行为。 为什么内置组件在重定向时不起作用?

cd - | command

不会更改目录。

export NAME=VALUE | command

不会创建变量。

谢谢。

2 个答案:

答案 0 :(得分:3)

管道的链接在分叉的子壳中运行。

在bash中,您可以使用$ BASHPID打印当前进程的PID,如下所示:

self(){ echo $BASHPID; } ; self ; self >&2 | self; self

应该给你这样的东西:

12849
12851
12852
12849

中间的两个PID不同于第一个和最后一个(母壳)(在一些shell中,第一个或最后一个链接在母shell中运行,但不在bash中运行)。

更改当前目录或导出子shell中的值不会以任何方式影响父shell。

答案 1 :(得分:0)

我认为你混淆了管道' |'用分号';'在构建工具链时。管道用于将一个命令的stdout传递给另一个命令的stdin。 分号用于在同一个shell中运行一个接一个的命令。

因此,为了进入某个目录并列出其内容,您应该这样做:

cd somedir; ls

通常在Linux中,管道的所有进程都在子shell中同时启动,它们的流被适当地连接,并由调度程序与在机器上运行的所有其他进程一起管理。它们的输出通过缓冲区重新连接并同步

这就是为什么你没有看到export命令的变化,因为变量留在了孩子的子shell中。