如何在主 shell 中运行命令块?

如何在主 shell 中运行命令块?

我尝试在主 shell 内作为一个整体运行一系列命令,但我所学到的方法仅适用于子 shell 内:

答案1

取决于你的意思作为一个整体

如果您只想向 shell 发送多个命令,并确保 shell 在您输入所有命令之前不会开始运行它们,那么您可以这样做:

cmd1; cmd2

或者

指令1Ctrl+VCtrl+J指令2

(或启用括号粘贴 ( bind 'set enable-bracketed-paste on') 并从支持括号粘贴的终端粘贴命令)。

或者:

{
cmd1
cmd2
}

让它们分成几行。

例如,如果您想对它们进行分组,以便它们共享相同的 stdin 或 stdout,您可以使用:

{ cmd1; cmd2; } < in > out

或者

eval 'cmd1; cmd2' < in > out

如果您希望它们使用自己的变量和选项范围运行,因为bash没有等效的zsh匿名函数,您需要定义一个临时函数:

f() { local var; var=foo; bar;}; f

答案2

使用在当前 shell中( something )启动的,而不是在子 shell 中启动的 。something{ something ; }something

后面需要空格{,并且前面还应该有一个;(或换行符)}

前任:

$ { echo "hello $BASHPID";sleep 5;echo "hello again $BASHPID" ; }
hello 3536
hello again 3536

但请注意,如果您启动一些复杂的命令(或管道命令),那么大多数时候这些命令都将位于子 shell 中。

获取当前 shell 的 pid 的“便携式”方法是$$

所以我会把你的测试写成:

{ echo "hello $$"; sleep 5 ; echo "hello again $$" ; }

(无论如何,睡眠在这里并没有多大用处)

相关内容