Копаясь в исходном коде bash, я смог выяснить, что bash на самом деле будет игнорировать разветвления, если нет каналов или перенаправлений. Из строки 1601 в выполнить _cmd.c:
/* If this is a simple command, tell execute_disk_command that it
might be able to get away without forking and simply exec.
This means things like ( sleep 10 ) will only cause one fork.
If we're timing the command or inverting its return value, however,
we cannot do this optimization. */
if ((user_subshell || user_coproc) && (tcom->type == cm_simple || tcom->type == cm_subshell) &&
((tcom->flags & CMD_TIME_PIPELINE) == 0) &&
((tcom->flags & CMD_INVERT_RETURN) == 0))
{
tcom->flags |= CMD_NO_FORK;
if (tcom->type == cm_simple)
tcom->value.Simple->flags |= CMD_NO_FORK;
}
Позже эти флаги переходят к execute_disk_command()
функции, которая устанавливает целочисленную переменную nofork , которая затем проверяется перед попыткой разветвления .Сама фактическая команда будет запускаться execve()
оболочкой функциональной оболочкой _execve()из разветвленного или родительского процесса, и в этом случае это фактический родитель.
Причина такой механики хорошо объяснена в ответе Стефана .
Дополнительное примечание, выходящее за рамки этого вопроса :, следует отметить, что, по-видимому, имеет значение, является ли оболочка интерактивной или работает через -c
. Перед выполнением команды будет форк. Это видно из запуска strace
в интерактивной оболочке(strace -e trace=process -f -o test.trace bash
)и проверки выходного файла :
.
19607 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_t
idptr=0x7f2d35e93a10) = 19628
19607 wait4(-1,
19628 execve("/bin/true", ["/bin/true"], [/* 47 vars */]) = 0
См. также Почему bash не создает подоболочку для простых команд?
Boost переместил загрузку в JFrog Artifactory
Для пользователей Boost единственное отличие состоит в том, что появился новый URL-адрес для загрузки выпусков и моментальных снимков.
Вместо:https://dl.bintray.com/boostorg/release/вы должны использоватьhttps://boostorg.jfrog.io/artifactory/main/release/для получения ускоренных выпусков.
Якобы -это исправит:
https://github.com/ethereum-mining/ethminer/commit/47348022be371df97ed1d8535bcb3969a085f60a
cmake/Hunter/config.cmake
@@ -1,2 +1,7 @@
hunter_config(CURL VERSION ${HUNTER_CURL_VERSION} CMAKE_ARGS HTTP_ONLY=ON CMAKE_USE_OPENSSL=OFF CMAKE_USE_LIBSSH2=OFF CURL_CA_PATH=none)
- hunter_config(Boost VERSION 1.66.0)
+ hunter_config(
+ Boost
+ VERSION 1.66.0_new_url
+ SHA1 f0b20d2d9f64041e8e7450600de0267244649766
+ URL https://boostorg.jfrog.io/artifactory/main/release/1.66.0/source/boost_1_66_0.tar.gz
+ )