我嘗試在主 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 $$" ; }
(無論如何,睡眠在這裡並沒有多大用處)