RLIMIT_NPROC не управляет числом детей, которых может иметь процесс.
Это управляет общим количеством процессов, которые может иметь пользователь. Строго говоря, поскольку это - установка для каждого процесса, когда ветвление (), клон (), vfork (), и т.д. называет процесс, значение RLIMIT_NPROC для того процесса сравнивается с общим процессом, значат родительского пользователя того процесса, не к числу детей, которых имеет процесс.
Конструкция variable = $ (...)
примет стандартный вывод любой команды из $ (...)
и назначит это в переменную
. Таким образом, чтобы получить переменную
, назначенную желаемым образом, значения должны быть отправлены на стандартный вывод. Это легко сделать с помощью команды echo
:
color_code=$(case "$COLOR" in
red) echo 1;;
yellow) echo 2;;
green) echo 3;;
blue) echo 4;;
esac)
Это будет работать с bash
, а также со всеми другими оболочками POSIX.
Согласно стандарту POSIX, левая скобка в операторе case
является необязательной, и также работает следующее:
color_code=$(case "$COLOR" in
(red) echo 1;;
(yellow) echo 2;;
(green) echo 3;;
(blue) echo 4;;
esac)
Как указывает Жиль в комментариях, не все оболочки принимают обе формы в сочетании с $ (...)
: впечатляюще подробную таблицу совместимости см. в "$ ()" подстановка команд против встроенных ")" .
color_code=$(...)
назначает вывод команды ...
переменной color_code
, при этом окончательные строки удаляются. Так что вам нужно произвести некоторый вывод. Код, который вы написали, пытается выполнить 1
в качестве команды.
Вы можете использовать эту идиому. Обратите внимание, что color_code
будет пустым, если $COLOR
не является ни одним из поддерживаемых значений.
color_code=$(case "$COLOR" in
(red) echo 1;;
(yellow) echo 2;;
(green) echo 3;;
(blue) echo 4;;
esac)
Но это не очень идиоматично. Язык оболочки ориентирован на простые комбинации простых команд. Эта большая подстановка команд является неудобной. Подстановка команд создает подоболочку, что медленнее, чем простой метод:
case "$COLOR" in
red) color_code=1;;
yellow) color_code=2;;
green) color_code=3;;
blue) color_code=4;;
esac
Главное семантическое различие между двумя подходами заключается в том, что $(...)
создает подоболочку, так что любое присваивание, выход, перенаправление и т.д., выполняемое внутри, не имеет никакого эффекта снаружи.