Questions tagged «subshell»

2
括号是否真的将命令放在子外壳中?
根据我的阅读,将命令放在括号中应该将其运行在子外壳中,类似于运行脚本。如果是这样,如果不导出x,它将如何看到变量x? x=1 (echo $x)在命令行上运行会导致1 echo $x如预期那样,在脚本中运行不会产生任何结果

3
$()是subshel​​l吗?
我知道subshel​​l语法为(<commands...>),$()仅仅是可以从中检索变量值的子shell? 注意:这适用于基于其文档中不同措辞的bash 4.4。
51 bash  subshell  syntax 

4
为什么(退出1)不退出脚本?
我有一个脚本,当我想要它时不会退出。 具有相同错误的示例脚本是: #!/bin/bash function bla() { return 1 } bla || ( echo '1' ; exit 1 ) echo '2' 我假设看到输出: :~$ ./test.sh 1 :~$ 但我实际上看到了: :~$ ./test.sh 1 2 :~$ ()命令链是否以某种方式创建作用域?什么是exit退出了,如果不是脚本?

3
用花括号创建Bash子外壳
根据此,将花括号之间的命令列表导致在当前外壳上下文要执行的列表。没有创建子外壳。 用ps看到这个在行动 这是直接在命令行上执行的流程管道的流程层次结构。4398是登录外壳程序的PID: sleep 2 | ps -H; PID TTY TIME CMD 4398 pts/23 00:00:00 bash 29696 pts/23 00:00:00 sleep 29697 pts/23 00:00:00 ps 现在遵循直接在命令行上执行的花括号之间的流程管道的流程层次结构。4398是登录外壳的PID。类似于上面的层次结构,证明了一切都在当前的shell上下文中执行: { sleep 2 | ps -H; } PID TTY TIME CMD 4398 pts/23 00:00:00 bash 29588 pts/23 00:00:00 sleep 29589 pts/23 00:00:00 ps 现在,这是sleep流水线本身放置在花括号内时的流程层次结构(因此,花括号总共有两个级别) { …
31 bash  subshell 

6
从子外壳退出外壳脚本
请考虑以下代码段: stop () { echo "${1}" 1>&2 exit 1 } func () { if false; then echo "foo" else stop "something went wrong" fi } 通常,当func被调用时,它将导致脚本终止,这是预期的行为。但是,如果它是在子外壳中执行的,例如 result=`func` 它不会退出脚本。这意味着调用代码必须每次检查函数的退出状态。有办法避免这种情况吗?这set -e是为了什么?

3
如何检测我是否在子外壳中?
我正在尝试编写一个函数来替换exit内置函数,以防止自己退出终端。 我试图使用SHLVL环境变量,但是在子外壳中似乎没有改变: $ echo $SHLVL 1 $ ( echo $SHLVL ) 1 $ bash -c 'echo $SHLVL' 2 我的功能如下: exit () { if [[ $SHLVL -eq 1 ]]; then printf '%s\n' "Nice try!" >&2 else command exit fi } 但是,这不允许我exit在子shell中使用: $ exit Nice try! $ (exit) Nice try! 有什么好的方法可以检测我是否在子外壳中?
24 bash  shell  exit  subshell 

3
在Bash中调用subshel​​l的规则?
我似乎误解了Bash创建子shell的规则。我认为括号总会创建一个子外壳,该子外壳将作为其自身的进程运行。 但是,事实并非如此。在代码片段A(如下)中,第二条sleep命令未在单独的外壳程序中运行(由pstree另一个终端确定)。但是,在代码片段B中,第二个sleep命令确实在单独的外壳中运行。这些代码段之间的唯一区别是第二个代码段在括号内有两个命令。 有人可以解释一下创建子外壳的规则吗? 代码片段A: sleep 5 ( sleep 5 ) 代码片段B: sleep 5 ( x=1 sleep 5 )

3
该脚本如何确保自身只运行一个实例?
2013年8月19日,Randal L. Schwartz发布了该 Shell脚本,该脚本旨在确保在Linux上“该脚本只有一个实例在运行,而没有竞争条件或无需清除锁定文件”: #!/bin/sh # randal_l_schwartz_001.sh ( if ! flock -n -x 0 then echo "$$ cannot get flock" exit 0 fi echo "$$ start" sleep 10 # for testing. put the real task here echo "$$ end" ) < $0 它似乎按广告宣传工作: $ ./randal_l_schwartz_001.sh & ./randal_l_schwartz_001.sh [1] 11863 11863 …

2
为什么变量在子Shell中可见?
《学习狂书》提到子shell将仅继承环境变量和文件描述符等,并且不会继承未导出的变量: $ var=15 $ (echo $var) 15 $ ./file # this file include the same command echo $var $ 据我所知,shell将为for ()和for 创建两个子shell ./file,但是为什么在()子shell中var虽然没有导出变量却标识了变量,而在./file没有标识的情况下为什么呢? # Strace for () clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25617 # Strace for ./file clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25631 我试图用来strace弄清楚这种情况是如何发生的,令人惊讶的是,我发现bash将对克隆系统调用使用相同的参数,因此这意味着分叉的进程()和./file应该具有与父进程相同的进程地址空间,所以为什么在这种()情况下,子外壳可见该变量,而在相同./file情况下基于克隆系统调用,则不会发生这种情况?
18 bash  shell  subshell 

1
在zsh中,cat <(cat)与cat |之间的区别 猫vs猫=(猫)?
我期望cat &lt;(cat)并cat | cat做同样的事情:将行从stdin复制到stdout。我的理解是,两者都将cat在子shell中执行一个,将子shell cat的stdout 重定向到一个临时的命名管道,然后cat在当前shell中执行另一个,将其stdin重定向到该管道。 取而代之的是cat &lt;(cat)让我在终端上键入内容,但是没有任何输入行被复制并且^D无法发出信号EOF;cat | cat工作正常。 作为进一步的实验,我检查了是否cat =(cat)有与相似的困难cat &lt;(cat),但是它按我的预期工作:一次将所有stdin直到一个^Dget都复制到stdout。 谁能帮助我了解zsh的功能?

7
收集并行后台进程的退出代码(子shell)
假设我们有一个bash脚本,如下所示: echo "x" &amp; echo "y" &amp; echo "z" &amp; ..... echo "Z" &amp; wait 有没有办法收集子外壳程序/子进程的退出代码?寻找这样做的方法,找不到任何东西。我需要并行运行这些子shell,否则,这会更容易。 我正在寻找一个通用的解决方案(我有一个未知/动态数量的子进程可以并行运行)。

5
这是bash中的错误吗?如果从管道调用`return`不会退出功能
最近我在使用bash时遇到了一些奇怪的问题。在尝试简化脚本时,我想到了以下一小段代码: $ o(){ echo | while read -r; do return 0; done; echo $?;}; o 0 $ o(){ echo | while read -r; do return 1; done; echo $?;}; o 1 return应该没有打印就退出了功能$?,不是吗?好吧,然后我检查了是否可以单独从管道返回: $ echo | while read -r; do return 1; done bash: return: can only `return' from a function …

5
有状态的bash功能
我想在Bash中实现一个函数,该函数在每次调用时都会增加(并返回)计数。不幸的是,这似乎很简单,因为我正在子外壳中调用该函数,因此它无法修改其父外壳的变量。 这是我的尝试: PS_COUNT=0 ps_count_inc() { let PS_COUNT=PS_COUNT+1 echo $PS_COUNT } ps_count_reset() { let PS_COUNT=0 } 这将按如下方式使用(因此需要从子shell调用函数): PS1='$(ps_count_reset)&gt; ' PS2='$(ps_count_inc) ' 这样,我将获得一个编号的多行提示: &gt; echo 'this 1 is 2 a 3 test' 可爱。但由于上述限制,因此无法使用。 不可行的解决方案是将计数写入文件而不是变量。但是,这会在多个同时运行的会话之间产生冲突。当然,我可以将Shell的进程ID附加到文件名中。但是我希望有一个更好的解决方案,它不会使我的系统中包含很多文件。

3
“子外壳”和“子进程”之间的确切区别是什么?
根据这个和这个,一个子shell通过使用括号开始(…)。 ( echo "Hello" ) 根据这个,这个和这个,当命令以&amp; echo "Hello" &amp; Posix规范在此页面中使用该词subshell,但未定义该词,并且在同一页面上也未定义“子进程”。 两者都使用内核fork()功能,对吗? 那么,将某些forks称为“ sub-shell”,而将另一些forks称为“子进程”,则有什么区别呢?
16 bash  shell  subshell 

3
陷阱是由subshel​​l继承的吗?
我尝试了以下脚本: #!/bin/bash trap 'echo "touching a file" &amp;&amp; touch $FILE' EXIT foo1(){ echo "foo1" } foo(){ echo "foo" export FILE=${FILE:-/tmp/file1} } (foo1) foo 上面脚本的输出是: [root@usr1 my_tests]# ./test.sh foo1 foo touching a file 但是,我也希望在退出时也要调用trap foo1,这是在子shell中调用的。 这是预期的吗? 是trap由subshel​​l继承的吗? 如果是,那么trap子外壳程序在什么情况下会继承?
14 shell  trap  subshell 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.