我们正在开发一个shell(学校项目)。我们不了解某种行为。 为什么内置组件在重定向时不起作用?
像
cd - | command
不会更改目录。
或
export NAME=VALUE | command
不会创建变量。
谢谢。
答案 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中。