Questions tagged «subshell»

2
子外壳的Bash语法高亮
考虑到大量问题都与Bash中的子外壳有关(“为什么我的变量不会在此管道while read循环中递增?”),我只是认为在代码中引用一些编辑器或服务会非常好将在子Shell中执行的代码的格式与在父Shell中执行的代码的格式不同。它可能作为一种教育工具很有用(请参阅code | code和code < <(code)立即之间的区别)。是否存在? 如果有人为jEdit或VIm实现它,则奖励积分。 显然,它并不一定是完美的(根据我的经验,没有突出显示语法),但是我怀疑类似的东西(foo=bar; echo $foo;)并且开始时command | while read ...应该不会太困难。

2
如何获取子外壳的PID?
如何获取子外壳的PID? 例如: $ echo $$ 16808 这不起作用,因为原始外壳扩展了$$: $ ( echo $$ ) 16808 为什么单引号不起作用?在原始外壳删除单引号之后,子外壳$$本身不会扩展吗? $ ( echo '$$' ) $$ 为什么也eval不起作用?是eval由subshel​​l运行的吗?为什么给我原始外壳的PID? $ ( eval echo '$$' ) 16808 谢谢。
13 bash  process  subshell 

2
子外壳与子外壳是否相同
有两个名称:subshel​​l和child-shell。 是的,子进程将通过以下任何一种方式启动: sh -c 'echo "Hello"' ( echo "hello" ) echo "$(echo "hello") echo "hello" | cat 是否都相同并具有相同的名称?所有共享相同的属性吗? POSIX 具有以下定义: Shell执行环境由...组成。 但是上面链接的最后一段有: 子外壳程序环境应作为外壳程序环境的副本创建,但不忽略的信号陷阱应设置为默认操作。 特别是: 命令替换,用括号分组的命令以及异步列表应在子shell环境中执行。另外,多命令管道中的每个命令都在子shell环境中。.... 其中sh -c 'echo "Hello"'不包含,也应该称为subshel​​l吗?

2
在执行子壳之前先展开它?
我经常使用子外壳运行命令,有时希望在运行某些东西之前先扩展子外壳。 例如,如何在运行之前扩展以下命令行,以便可以编辑子shell的结果? 例如 $ find -name "test.txt" /tmp/test.txt $ mv $(!!) /tmp/new.txt 我希望在运行命令之前看到子外壳已扩展,如下所示: $ mv /tmp/test.txt /tmp/new.txt 有什么办法可以做到这一点?

2
如何从父外壳中的子外壳中获取变量
我编写了一个简单的脚本来为Web服务中的一些报告计时: BASE_URL='http://example.com/json/webservice/' FIRST=1 FINAL=10000 for report_code in $(seq 1 $FINAL); do (time -p response=$(curl --write-out %{http_code} --silent -O ${BASE_URL}/${report_code}) ) 2> ${report_code}.time echo $response # <------- this is out of scope! How do I fix that? if [[ $response = '404' ]]; then echo "Deleting report # ${report_code}!" rm ${report_code} …

2
括号命令组为什么在POSIX Shell语法中的左括号之后需要空格?
TL; DR:为什么POSIX大括号组在{保留字之后需要空格,但是在保留字之后不需要subshel​​l (? POSIX Shell语法定义了括号组和子shell,如下所示 brace_group : Lbrace compound_list Rbrace subshell : '(' compound_list ')' 现在,如果从字面上看,空格是很重要的。这将意味着必须有空间来描述开括号和闭括号以及括号,如 { echo hello world; } ( echo hello world ) 这也将与“ 复合命令”定义保持一致: 这些复合命令中的每一个在开头都有一个保留字或控制运算符,在结尾处有一个对应的终止符保留字或运算符。 但是,没有意义的是为什么(list)并且可以( list )正常工作((不需要后面的空格),但是括号扩展必须有一个前导空格,即{echo hello;}不起作用。 当然,保留字被视为空壳字会有意义,之后需要一个空格以与字段拆分的概念保持一致,但是定义本身并未提及空格。此外,如果POSIX的复合命令定义都将{和(都视为保留字,那么为什么在这些保留字之后的空格字符方面会有不同的对待?现在,ksh(1)手册确实指出: 单词是字符序列,由无引号的空格字符(空格,制表符和换行符)或元字符(<,>,|,;,&,(和))定界 换句话说,有意义的是ksh将被识别(为单词定界符,其中第一个单词将是命令或变量赋值。POSIX,但是似乎没有提到(元字符。就POSIX语法而言,我发现的唯一可能的解释是{被认为是“令牌”,此处(未列出为一个。 /* These are reserved words, not operator tokens, and are recognized when reserved words …
10 shell  posix  subshell  syntax 

1
如何为使用`nohup`执行的程序设置环境变量?
(我正在编辑现有的Bash脚本,因此我可能在这里犯了一个愚蠢的错误...) 我有一个shell脚本,它以环境变量作为参数保存命令,如下所示: COMMAND="mvn clean install -P $MAVEN_PROFILE" 然后,它nohup大致如下执行命令: nohup $COMMAND > logfile 这可行。 现在,我想设置一个可以在Maven中访问的环境变量。我已经尝试了以下几种方法: COMMAND="FORMAVEN=valueForMaven mvn clean install -P $MAVEN_PROFILE" ...但随后它终止于: nohup: failed to run command `FORMAVEN=valueForMaven': No such file or directory 我觉得这里有几个不相关的概念在起作用,我都不了解甚至不知道。我需要什么才能做到以上几点?


1
为什么以存储的嵌套命令返回码退出会导致Dash和Bash中的返回码不同?
跑步 bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;' 根据我的理解,这导致将结果test1打印到控制台并echo $?进行打印1,因为命令应该返回内部[b/d]ash -c返回的内容,而 dash -c 'dash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;' 结果相同,但0根据则返回echo $?。 我想了解这种差异,以便加深对Shell和可移植Shell编程的了解。 我在Ubuntu 17.10(Artful Aardvark)上使用bash4.4.12和dash0.5.8-2.3ubuntu1。

5
如何在Korn Shell中获取subshel​​l的PID(相当于$ BASHPID)
在bash中,您有一个方便的变量:$ BASHPID wich始终返回当前运行的子Shell的PID。如何在ksh中获取子外壳的PID?例如,请参见下面的代码: #!/usr/bin/ksh93 echo "PID at start: $$" function run_in_background { echo "PID in run_in_background $$" run_something & echo "PID of backgrounded run_something: $!" } function run_something { echo "*** PID in run_something: $$" sleep 10; } run_in_background echo "PID of run in background $!" 输出以下内容: PID at start: …
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.