如何在主 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 $$" ; }

(無論如何,睡眠在這裡並沒有多大用處)

相關內容