Linux 变量 $BASH_SUBSHELL 与 $SLVL 之间的区别

2024-02-13

我对两者感到困惑。

虽然 $BASH_SUBSHELL 内部变量指示子 shell 的嵌套级别,但 $SLVL 变量显示子 shell 内没有任何更改。

它究竟意味着什么?如果我在另一个 shell 中打开一个 shell,则 $SLVL 的值会增加。这不是子壳吗?


不,手动运行一个新的 shell(通过/bin/sh or /bin/bash等)是not在此上下文中的子 shell。

子 shell 是指 shell 生成新的 shell 实例时在其自己的来处理一些工作。

Using 命令替换 http://www.gnu.org/software/bash/manual/bashref.html#Command-Substitution (i.e. $(command)) 是一个子 shell(与旧的反引号调用一样)。

Using a pipeline http://www.gnu.org/software/bash/manual/bashref.html#Pipelines (i.e. echo '5.1+5.3' | bc -l) 为管道的每个组件创建子 shell。

Using 流程替代 http://www.gnu.org/software/bash/manual/bashref.html#Process-Substitution (i.e. <(command)) 创建一个子shell。

分组命令 http://www.gnu.org/software/bash/manual/bashref.html#Command-Grouping (i.e. (declare a=5; echo $a)) 创建一个子shell。

运行命令在的背景 http://www.gnu.org/software/bash/manual/bashref.html#Lists (i.e. sleep 1 &) 创建一个子shell。

可能还有其他情况,但这些都是常见情况。

测试这个很容易:

$ printf "Outside: $BASH_SUBSHELL , $SHLVL\nInside: $(echo $BASH_SUBSHELL , $SHLVL)\n"
Outside: 0 , 1
Inside: 1 , 1
$ (printf "Outside: $BASH_SUBSHELL , $SHLVL\nInside: $(echo $BASH_SUBSHELL , $SHLVL)\n")
Outside: 1 , 1
Inside: 2 , 1
$ bash -c 'printf "Outside: $BASH_SUBSHELL , $SHLVL\nInside: $(echo $BASH_SUBSHELL , $SHLVL)\n"'
Outside: 0 , 2
Inside: 1 , 2
$ bash -c '(printf "Outside: $BASH_SUBSHELL , $SHLVL\nInside: $(echo $BASH_SUBSHELL , $SHLVL)\n")'
Outside: 1 , 2
Inside: 2 , 2

您引用的来源(通常是穷人,并且通常最好避免,ABS http://www.tldp.org/LDP/abs/html/subshells.html)甚至稍微演示了这一点(并且以一种相当不清楚的方式,只是“高级”指南中普遍缺乏严谨性和质量的另一个例子):

echo " \$BASH_SUBSHELL outside subshell       = $BASH_SUBSHELL"           # 0
  ( echo " \$BASH_SUBSHELL inside subshell        = $BASH_SUBSHELL" )     # 1
  ( ( echo " \$BASH_SUBSHELL inside nested subshell = $BASH_SUBSHELL" ) ) # 2
# ^ ^                           *** nested ***                        ^ ^

echo

echo " \$SHLVL outside subshell = $SHLVL"       # 3
( echo " \$SHLVL inside subshell  = $SHLVL" )   # 3 (No change!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 变量 $BASH_SUBSHELL 与 $SLVL 之间的区别 的相关文章

  • SMP 上如何处理中断?

    SMP 对称多处理器 多核 机器上如何处理中断 内存管理单元是只有一个还是多个 假设两个线程 A 和 B 运行在不同的内核上 同时 访问页表中不存在的内存页面 在这种情况下 将会出现页面错误 并从内存中引入新页面 将会发生的事件的顺序是什么
  • 如何在perl中使用O_ASYNC和fcntl?

    我想使用 O ASYNC 选项 当管道可以读取时 SIGIO 的处理程序将运行 但以下代码不起作用 任何人都可以帮助我吗 bin env perl use Fcntl SIG IO sub print catch SIGIO n my fl
  • 忽略 sed 查找和替换命令中的斜杠

    我正在尝试在终端中使用 sed 进行查找和替换 在 apache 配置文件中 我尝试替换 DocumentRoot var www with DocumentRoot var www mysite com public html 从命令行
  • 如何在文件夹中的 xml 文件中 grep 一个单词

    我知道我可以使用 grep 在这样的文件夹中的所有文件中查找单词 grep rn core 但我当前的目录有很多子目录 我只想搜索当前目录及其所有子目录中存在的所有 xml 文件 我怎样才能做到这一点 我试过这个 grep rn core
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • 比较linux中的两个未排序列表,列出第二个文件中的唯一项

    我有 2 个包含号码列表 电话号码 的文件 我正在寻找一种列出第二个文件中第一个文件中不存在的数字的方法 我尝试过各种方法 comm getting some weird sorting errors fgrep v x f second
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • 如何在特定的Java版本上运行应用程序?

    如何运行具有特定 Java 版本的应用程序 我安装了三个 Java 版本 myuser mysystem sudo update alternatives config java There are 3 choices for the al
  • adb shell 输入带有空格的文本

    如何发送带有空格的文本 例如 一些文字 using adb shell input text 找到以下解决方案 adb shell input text some stext 工作正常 但是有什么简单的方法可以用 s 替换空格吗 Examp
  • 在 C# 中编写批处理脚本的好方法是什么?

    我想用 C 编写简单的脚本 我通常会使用 bat 或 4NT btm 文件 复制文件 解析文本 询问用户输入等等 相当简单 但在批处理文件中正确执行这些操作确实很困难 例如没有例外 我熟悉像 AxScript 这样的命令行 脚本 包装器 这
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • wget 并行下载文件并重命名

    我有一个包含两列的文本文件 第一列是要保存的名称 第二列是资源的 url 地址 10000899567110806314 jpg http lifestyle inquirer net files 2018 07 t0724cheekee
  • 用于获取特定用户 ID 和进程数的 Bash 脚本

    我需要 bash 脚本来计算特定用户或所有用户的进程 我们可以输入 0 1 或更多参数 例如 myScript sh root deamon 应该像这样执行 root 92 deamon 8 2 users has total proces
  • #*/ 在 UNIX Shell 脚本中使用

    谁能详细说明 在 UNIX Shell 脚本中的工作原理 我已经看到它在 Korn Shell 中的使用 它专门用于删除文件的扩展名 例如 func write app log o 删除状态文件 CIE STATUS FILE 这里假设文件
  • 使用 IFS bash 进行 CSV 解析:选择“;”作为分隔符

    我有一个包含 130 列的 CSV 我需要用它来做 3 个 csv 我用 while 和 IFS 循环 因为我需要对每一行的变量进行一些处理 这是我所做的 while IFS read my 130 vars what i do with
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • 从命令行更改 konsole 选项卡标题并使其持久?

    如何更改 konsole 选项卡标题 默认情况下 它设置为 u n 所以它总是自动改变 我可以这样设置 qdbus org kde konsole KONSOLE DBUS SESSION setTitle 1 My Title 但是一旦您
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • 隐式声明“gets”

    据我所知 隐式声明 通常意味着该函数必须在调用之前放置在程序的顶部 或者我需要声明原型 然而 gets应该在stdio h文件 我已包含 有没有什么办法解决这一问题 include
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判

随机推荐

  • Python 或 C/C++ 中的 RTSP 库?

    我正在尝试寻找任何适用于 Python 或 C C 的 RTSP 流媒体库 如果没有 还有其他实时流解决方案吗 在 Python 或 C C 中实现 RTSP 有多容易或困难以及从哪里开始 try live555 http www live
  • 具有多重索引的 Pandas 划分 (.div)

    我有类似的东西 df pd DataFrame np random randint 2 10 size 5 2 df index pd MultiIndex from tuples 1 A 2 A 4 B 5 B 8 B df index
  • TransformerFactory - 避免网络查找来验证 DTD

    我需要为 XML 文档的离线转换进行编程 当使用以下命令加载原始 XML 文件时 我已经能够停止 DTD 网络查找 DocumentBuilderFactory factory factory DocumentBuilderFactory
  • 使用 libcurl 而不使用 dll

    我正在使用 Microsoft Visual C 2010 我需要制作一个不需要 libcurl dll 的应用程序 我在预处理器指令中定义 CURL STATICLIB 并链接到 libcurl lib libcurl static li
  • Nivo 滑块 + php

    我为网站创建了一个自定义 cms 并尝试使 nivo 滑块与我的数据库配合使用 但我的 while 循环出现问题 我只将图像的名称存储在数据库中 而图像本身存储在文件夹中 图像可以正常工作 但它们显示在实际幻灯片的上方 而实际的幻灯片已损坏
  • 如何使用 php 覆盖 Apache keep-alive 标头?

    在我的 httpd conf 中有 KeepAliveTimeout 1 我正在尝试覆盖 Apache KeepAliveTimeout 设置singlephp 脚本 不在整个服务器中 所以我有一个 php 脚本 header Keep A
  • 为什么使用“youtube.com/v”的 YouTube 视频无法加载

    请查阅这一页 http www islandcricket lk videos sri lanka cricket it feels great mathews talks about test series victory against
  • PHP shell_exec - 如果连接关闭如何终止进程?

    我有一个可用的 php 脚本 使用 shell exec 来执行一个外部程序 大约需要 30 秒才能完成 问题是 如果用户关闭浏览器或由于某种原因关闭连接 则使用 shell exec 执行的程序将继续运行 因为它的输出无法再发送给用户 有
  • 将 Qt 与 Visual Studio Code 结合使用 (Windows)

    安装了以下内容 Visual Studio 代码 1 45 1 Visual Studio 2019 Community 为了使用 MSVCcl exe编译器 Qt 5 15 0 安装到 C Qt Visual Studio Code运行后
  • Ping 与“连接”到远程服务器[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 什么情况下会无法使用以下命令 ping 通远程服务器ping命令 但仍然能够通过其他方式连接到它 只要它仍然是 TCP IP ping
  • 相当于“pip”的“package.json”和“package-lock.json”

    包管理器JavaScript like npm and yarn use a package json指定 顶级 依赖项 并创建一个锁定文件 https docs npmjs com files package locks跟踪特定版本all
  • 使用 dplyr::filter() 删除 NA 观测值

    我的数据如下所示 library tidyverse df lt tribble a b c 1 2 3 1 NA 3 NA 2 3 我可以删除所有NA观察与drop na df gt drop na 或者全部删除NA单列中的观察值 a例如
  • 调用 Isolate::New() 后执行位置 0x0000000000000000 时发生访问冲突

    我似乎无法弄清楚如何启动 V8 我有这个代码 if V8Initialized v8 V8 InitializeICU v8 V8 InitializeExternalStartupData x86 this loads ok I chec
  • HTML5可以指定滚动条图像吗?

    我需要显示自定义滚动条 如果可能的话 我想避免使用 jQuery 插件 那么我可以用 HTML5 和 CSS3 来做这样的事情吗 myScrollableBox width 200px height 500px Display scroll
  • 如何根据草图值计算 TextView 的 letterSpacing?

    在设计中 我有一个文本字段 文本大小为 16 字符间距为 0 6 但是 如果我设置这个值android letterSpacing的属性TextView间距将比设计时大得多 那么 将sketch值转换为android值的方法是什么呢 根据
  • 动态调整 SVG 多边形的大小和拖动

    我正在努力寻找一种用鼠标动态调整 svg 多边形大小和拖动多边形的方法 不幸的是 jQueryUi 不适用于 svg 元素 我还检查了拉斐尔库 但找不到任何有关如何实现这一点的文档 片段 除了使用 SVG 之外 还有其他方法可以动态调整多边
  • Julia 中的虚拟变量

    在 R 中 有一个很好的功能 可以针对分类变量的每个级别使用虚拟变量运行回归 例如自动将 R 因子扩展为每个因子水平的 1 0 指标变量的集合 https stackoverflow com questions 5048638 automa
  • 使用 jquery 获取自定义标签值

  • 在 pandasql 中使用字典值

    我有一本字典 其中包含值的数据帧 如下所示 mydict demand demand df supply supply df prod prod df 然后我正在使用pandasql模块来执行简单的查询 query SELECT FROM
  • Linux 变量 $BASH_SUBSHELL 与 $SLVL 之间的区别

    我对两者感到困惑 虽然 BASH SUBSHELL 内部变量指示子 shell 的嵌套级别 但 SLVL 变量显示子 shell 内没有任何更改 它究竟意味着什么 如果我在另一个 shell 中打开一个 shell 则 SLVL 的值会增加