带重定向的shell内置

带重定向的shell内置,shell,unix,Shell,Unix,我们正在做一个壳牌(学校项目)。我们不理解一种行为。 为什么重定向时内置不起作用 像 不更改目录 或 不创建变量 谢谢。管道的链接在分叉的子外壳中运行 在bash中,可以使用$BASHPID打印当前进程的PID,如下所示: self(){ echo $BASHPID; } ; self ; self >&2 | self; self 12849 12851 12852 12849 应该给你一些类似的东西: self(){ echo $BASHPID; } ; self ; se

我们正在做一个壳牌(学校项目)。我们不理解一种行为。 为什么重定向时内置不起作用

不更改目录

不创建变量


谢谢。

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

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

self(){ echo $BASHPID; } ; self ; self >&2 | self; self
12849
12851
12852
12849
应该给你一些类似的东西:

self(){ echo $BASHPID; } ; self ; self >&2 | self; self
12849
12851
12852
12849
中间的两个PID不同于第一个和最后一个(母shell)(在某些shell中,第一个或最后一个链接在母shell中运行,而不是在bash中运行)


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

我认为您混淆了管道“|”和分号“;”在构建工具链时。管道用于将一个命令的stdout传递到另一个命令的stdin。 分号用于在同一shell中连续运行一个命令

因此,为了输入某个目录并列出其内容,您应该执行以下操作:

cd-somedir;ls

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


这就是为什么您看不到
export
命令的更改,因为变量保留在child的子shell中。

好的,谢谢,有意义。chdir仅适用于调用进程。