我維護了一些遺留的 Linux shell 腳本代碼,我遇到了這樣的事情:
#!/bin/sh
foo()
{
exec some_shell_command &
return 0
}
foo
我很好奇這種shell腳本的效果。some_shell_command 是否在另一個子行程中執行?而exec命令執行后,shell腳本行程是否變成了some_shell_command行程?
提前致謝。
uj5u.com熱心網友回復:
some_shell_command 是否在另一個子行程中執行?
是的。
exec 命令執行后,shell 腳本行程是否成為 some_shell_command 行程?
有兩個行程,一個為后臺生成的行程變為some_shell_command. 父級繼續執行。
這是否意味著'exec'沒有意義?
在這個特定的背景關系中,它沒有什么意義。通常,您應該期望 Bash 進行優化,如果 Bash 發現只有一個命令,它會將其優化為exec.
$ strace -ff bash -c '/bin/echo 1' 2>&1 | grep clone
# nothing, because `fork()` is optimized out
有案例(見https://github.com/bminor/bash/blob/f3a35a2d601a55f337f8ca02a541f8c033682247/builtins/evalstring.c#L441 https://github.com/bminor/bash/blob/f3a35a2d601a55f337f8ca02a541f8c0336822247/builtins/builtinsc#evalstring.c#L441 L124 ) 命令未優化的地方,主要是在trap命令完成后 Bash 需要執行的類似或某些信號處理的情況下。
另一個區別是它exec 需要一個可執行檔案,如果沒有exec它some_shell_command可能是一個內置函式或別名。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/430763.html
下一篇:使用子命令查找-exec
