subshell相关内容
echo hello | read str echo $str read在管道之后执行,这意味着echo的输出被读入str,但由于它位于管道之后,str的内容现在位于父外壳无法读取的子外壳中。 str的内容发生了什么?管道是否创建子外壳,然后一旦内容被读入str,父进程是否杀伤子进程并擦除str-或者str的内容继续存在于外壳之外的某个地方?比如,我们如何看清亚壳里有什么?我们可以从父外壳中
..
我对bash 变量是否导出到子shell 以及脚本何时可以访问感到困惑.到目前为止,我的经验使我相信 bash 变量自动可用于子 shell.例如: >FOO=酒吧>回声 $FOO酒吧>(回声 $FOO)酒吧 以上似乎表明 bash 变量可以在子 shell 中访问. 鉴于此脚本: #!/usr/bin/bash# c.sh函数(){回声之前回声 ${FOO}回声后}功能 我知道在当
..
如何将多个命令的标准输出通过管道传输到单个命令? 示例 1:对所有三个 echo 命令的输出进行组合和排序: echo zzz;回声 aaa;回声 期望的输出: aaakkk赞 示例 2:重写以下内容,以便所有命令都在使用管道的单个命令行中,而不重定向到临时文件: setopt >/tmp/foo;取消设置>/tmp/foo;设置 >>/tmp/foo;排序/tmp/foo 解决
..
昨天有人建议我在 bash 中使用命令替换会导致生成一个不必要的子 shell.该建议专门针对此用例: #额外的子shell产生foo=$(command; echo $?)# 没有额外的子shell命令foo=$? 尽我所能,这对于这个用例来说似乎是正确的.然而,试图验证这一点的快速搜索会导致大量令人困惑和矛盾的建议.似乎流行的智慧说所有命令替换的使用都会产生一个子shell.例如:
..
编辑: 我在下面关于 sed 's@^@ @' >(sed 's@^@ @') 而这似乎可以正常工作.不过,对于第一种形式,BASH_SUBSHELL 不应该是 1 而不是 0 吗? 考虑这个小测试 #!/bin/bash
..
initiate() {read -p "在其中查找 .bsp 文件的位置?" locfind $loc -name "*.bsp" |阅读时做如果 [ -f "$loc.bz2" ]然后继续别的filcount=$[$filcount+1]bzip $loc菲if [ "$scan" == "1" ];然后 bzipint $loc菲echo $filcount #正确计数echo $zipco
..
以这种方式尝试: #!/bin/bashmyvals=`psql -d mydb -c "select id from table1 where 't'"`ssh user1@host1.domain.tld "for i in $myvals; do echo \$i >> values; done" 只要 psql 只返回一个值,它就可以正常工作.但是如果它有几个值,我会收到这个回复:
..
在script.sh中, 源a.sh来源b.shCMD1CMD2CMD3 如何用其内容替换 source * .sh (不执行命令)?我想看看在寻找文件并扩展所有变量之后,bash解释器将执行什么操作. 我知道我可以使用 set -n -v 或运行 bash -n -v script.sh 2> output.sh ,但这不会代替源代码命令(如果a.sh或b.sh包含变量,则更少).
..
我当前的PS1: PS1 ='\ [\ 033] 0; $ TITLEPREFIX:$ {PWD//[^ [:ascii:]]/?} \ 007 \] \ n \ [\ 033 [32m \] \u @ \ h \ [\ 033 [35m \]`date +%Y-%m-%d,%H:%M:%S` \ [\ 033 [33m \] \ w \ [\ 033 [36m \]`__git_ps1` \
..
因此,此读取是在管道之后执行的,这意味着回声的输出将被读取到 str 中-但是因为它在管道之后,所以 str 现在位于父shell无法读取的子shell中.我的问题是- str 的内容会怎样?管道是否创建了子外壳,然后将内容读入 str ,父进程是否杀死了子进程并删除了 str -还是 str 位于外壳外部的某个位置.就像我们如何看待子壳中的东西?我们可以从父外壳访问子外壳吗? echo你好|
..
ksh 具有一个非常有趣的构造来执行此操作,此答案中对此进行了详细说明: https://stackoverflow.com/a/11172617/636849 从Bash 4.0开始,有一个内置的 mapfile 内置命令可以解决此问题: http://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html 但是奇怪
..
命令: ( echo 1 ) 当我在命令行中输入它时,它工作正常,但是如果将其存储为变量并调用它,则会出现错误: (echo: command not found 代码: input="( echo 1 )" $input 为什么当我这样称呼括号时,它不以相同的方式评估括号并将其放入子壳中? 解决方案 这在 BashFAQ中进行了详细讨论. #50 .
..
基本上,我正在尝试退出包含循环的子外壳.这是代码: ` stop=0 ( # subshell start while true # Loop start do sleep 1 # Wait a second echo 1 >> /tmp/output # Add a line to
..
我很难理解zenity --progress --auto-kill的行为.它似乎不是杀死其父进程的子进程,而是以某种方式分离它们. 考虑以下shell脚本long-live-the-subshell.sh: #!/bin/sh ( echo sleeping...>&2; sleep 5; echo woke up >&2 ) | zenity --pro
..
因为我自己陷入了困境,所以我提出了一个问题,并在此给出了答案.如果find遍历命令找到的内容,则在bash执行该命令.因此,您无法在结果中填充数组并在循环后使用它. 解决方案 您必须将语法从以下位置更改: i=0 find $cont_dirs_abs -type l -exec test -e {} \; -print0 | while IFS= read -r -d '' lxc
..
我在同一目录中有3个脚本,请在下面找到x.sh,y.sh和z.sh的内容:- x.sh:- xData="DataOfX" function xInit(){ echo "xInit : data of a >$xData
..
在Linux bash shell中真正很棒的一件事是,您可以在子shell中定义变量,并且在该子shell完成定义的(环境?)变量之后,只要您定义它们而不导出它们,并且在子shell中,该变量就不存在了. 例如: $ (set bob=4) $ echo $bob $ 不存在变量,因此没有输出. 我最近也在写一些powershell脚本,并注意到我一直不得不在脚本末尾清空变
..
当我键入ls -l $(echo file)时,将括号中的输出(这只是简单的回显)输出并传递给外部ls -l命令.等同于简单的ls -l file. 当我键入ls -l (echo file)时,出现错误,因为不能将()嵌套在外部命令中. 有人可以帮助我了解$()和()之间的区别吗? 解决方案 $(cmd)将cmd的结果替换为字符串,而(cmd; cmd)在子进程中运行命令列表
..
我编写了一系列python工具,它们产生了新的bash会话.我希望这些单独的子shell继承父级的命令历史记录.我已经尝试过: shopt -s histappend PROMPT_COMMAND="history -an;$PROMPT_COMMAND" .bash_profile中的 .但这并没有给我我所需要的.我已经看到了.我的工具使用: os.system('bash')
..
这个问题不是Cygwin特有的.但是,在cygwin邮件归档文件中, https://cygwin.com/ml/cygwin-announce/2010-08/msg00015.html 是用于设置cygwin特定的igncr shellopt变量的各种指令,其中之一是指令: 4a.对于单个受影响的脚本,请在 she-bang:〜(set -o igncr)2>/dev/null&&设置-
..