我尝试在主 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 $$" ; }
(无论如何,睡眠在这里并没有多大用处)