linux - 关于 shell 和子 shell

标签 linux bash shell

我是 shell 的新手,我刚刚了解到使用 (command) 会创建一个新的子 shell 并执行命令,所以我尝试打印父 shell 和子 shell 的 pid:

#!/bin/bash

echo $$
echo "`echo $$`"
sleep 4
var=$(echo $$;sleep 4)
echo $var

但答案是:

$./test.sh
9098
9098
9098

我的问题是:

  1. 为什么只有三个 echo 打印?我的代码中有 4 个 echo。
  2. 为什么三个 pid 相同? subshel​​l 的 pid 显然和他父亲的不一样。

非常感谢您的回答:)

最佳答案

首先,分配捕获 child 的标准输出并将其放入var,而不是打印它:

var=$(echo $$;sleep 4)

这可以通过以下方式看到:

$ xyzzy=$(echo hello)
$ echo $xyzzy
hello

其次,所有这些 $$ 变量都在 current shell 中求值,这意味着它们在 任何子级之前被转换为当前 PID开始。 child 看到已经生成的 PID。换句话说, children 正在执行 echo 9098 而不是 echo $$

如果你想要子进程的 PID,你必须阻止在父进程中进行翻译,比如使用单引号:

bash -c 'echo $$'

关于linux - 关于 shell 和子 shell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10023666/

相关文章:

Linux 程序集未打印到标准输出 - 屏幕

bash - 在 MAC OSX 中比较 Bash 中的两个日期

mysql - 通过 shell 脚本使用 echo 命令自动化 mysql_secure_installation

shell - jabber - 创建房间

android - 可以从 Android 应用程序调用它们的合法 linux 命令?

windows - 如何为windows和linux电脑设置通用的emacs环境?

linux - 在 Crontab 中删除现有的作业/任务

bash - 使用两列比较三个文件并使用 awk/sed 在每个文件中打印唯一条目

linux - 我如何将pid写入文件

linux - 列出名称中包含空格的所有目录