【问题标题】:What does builtin commands means in bash?内置命令在 bash 中意味着什么?
【发布时间】:2017-02-13 16:33:31
【问题描述】:

我阅读了 bash 手册的一部分。项目是“命令执行环境”。部分说,

作为管道一部分调用的内置命令也在子 shell 环境中执行。对子 shell 环境所做的更改不会影响 shell 的执行环境。

我想这意味着管道中更改的值是本地的,因为管道中的每个命令都在其自己的子 shell 中运行。喜欢以下,

value='1'
echo "Before pipe, ${value}"
value='2' | echo "${value}" | value='3' | echo "In another pipe, ${value}"
echo "After pipe, ${value}"

Before pipe, 1
In another pipe, 1
After pipe, 1

我在 bash 中阅读了“SHELL BUILTIN COMMANDS”。但我找不到“=”作为内置命令。 “内置命令”在这里是什么意思?是否有“非内置命令”可以影响全局变化,即使在管道中?

如果您不介意,请在新的子 shell 运行时告诉我,除了:

  1. (...)
  2. 管道|

【问题讨论】:

  • 没有明确说明,但赋值本身实际上是退出状态为 0 的命令(假设值中没有嵌入命令替换或进程替换)。

标签: bash shell


【解决方案1】:

我认为手册基本上是在说内置命令,例如echoprintfread等,没有得到任何特殊处理,仍然在自己的子shell中运行,尽管原则上 shell 可以确定管道中的所有命令都可以在同一个 shell 中本地运行。

如果您要求将一个命令通过管道传输到另一个命令,则无论管道的两侧是什么,都会创建子 shell。

例如:

echo string | read foo

使用两个内置函数echoread,但变量$foo 在管道完成后不再存在。

【讨论】:

  • 我猜更多的是关于cdshoptset
  • @gniourf_gniourf 公平点,虽然我很难想出一个使用这些命令的例子。想想看,我很难想出一个一般的例子!
  • 我不确定我理解你的意思,但cdshoptset 在子shell 中非常有用! ( cd directory || exit 1; do_stuff_here ) # back to where I was before, without needing to cd back
  • @gniourf_gniourf 当然,同意。也许我们对这个问题的解释不同......
  • 关键是shell先fork,然后查看生成的子shell中要运行什么命令。
猜你喜欢
  • 2013-07-09
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多