#!/bin/bash
bar () {
# bashpid is set in our environment from the calling function
printf 'bar BASHPID = %d, bar bashpid = %d\n' "$BASHPID" "$bashpid"
# in your case, you would have...
local logfile="/some/path/to/log.$bashpid"
# etc.
}
foo () {
local bashpid="$BASHPID"
local message
local logfile="/some/path/to/log.$BASHPID"
message=$( bashpid="$bashpid" bar ); printf 'Message from bar: %s\n' "$message"
message=$( bashpid="$bashpid" bar ); printf 'Message from bar: %s\n' "$message"
message=$( bashpid="$bashpid" bar ); printf 'Message from bar: %s\n' "$message"
message=$( bashpid="$bashpid" bar ); printf 'Message from bar: %s\n' "$message"
}
foo &
foo &
foo &
wait
Пример запуска:
$ bash script.sh
Message from bar: bar BASHPID = 71979, bar bashpid = 18461
Message from bar: bar BASHPID = 7420, bar bashpid = 71036
Message from bar: bar BASHPID = 6109, bar bashpid = 18461
Message from bar: bar BASHPID = 27868, bar bashpid = 71036
Message from bar: bar BASHPID = 44547, bar bashpid = 60086
Message from bar: bar BASHPID = 69310, bar bashpid = 71036
Message from bar: bar BASHPID = 37649, bar bashpid = 60086
Message from bar: bar BASHPID = 15999, bar bashpid = 71036
Message from bar: bar BASHPID = 81520, bar bashpid = 18461
Message from bar: bar BASHPID = 92568, bar bashpid = 60086
Message from bar: bar BASHPID = 72438, bar bashpid = 18461
Message from bar: bar BASHPID = 15094, bar bashpid = 60086
Для каждого вызова foo
в основной части скрипта будет выполнено четыре вызова bar
и будут созданы четыре строки вывода. Как видите, есть только три уникальных bashpid
числа, каждое из которых относится к одному из foo
вызовов.
Другой способ передать $bashpid
из foo
в bar
, очевидно, передать его в качестве аргумента командной строки и получить с local bashpid="$1"
в bar
или что-то подобное, но вы говорите, что не не хочу этого делать.
Группы по своей сути не являются первичными или вторичными. Группа — это просто группа.
Важно то, как они используются.
Итак, давайте возьмем обычный сеанс входа в систему. (Я упрощу это для простоты объяснения, но та же логика применима и к более сложным случаям ).
Когда начинается процесс входа в систему для настройки членства в вашей группе, первое, что он делает, это просматривает файл passwd
.
Для меня на моей машине:
sweh:x:500:500:Stephen Harris:/home/sweh:/bin/ksh
Второе число определяет первичную группу . Итак, моя основная группа — это группа с идентификатором 500.
Следующее, что он делает, это просматривает групповой файл и видит, против каких записей указано мое имя пользователя:
% grep -w sweh /etc/group
wheel:x:10:sweh
sweh:x:500:
apache:x:48:sweh
news:x:13:news,sweh
Таким образом, мы можем видеть, что я был указан против групп 10, 48 и 13. Это вторичные группы.
Это можно увидеть с помощью команды id
:
% id
uid=500(sweh) gid=500(sweh) groups=500(sweh),10(wheel),13(news),48(apache)
Значение gid
указывает первичную группу. Значение groups
перечисляет все группы, в которых я состою. Все, что не является первичным, является вторичным.
Другой логин может иметь разные первичные и вторичные группы в зависимости от их записи в passwd
и group
.
Итак, мы видим, что «первичный» и «вторичный» основаны на контексте пользователя и на том, как этот пользователь определен. Это не основано на самой группе.