У вас должна быть возможность изменить уровень выполнения, поскольку уровень выполнения по умолчанию должен быть установлен в / etc / inittab
или символьную ссылку с / lib / systemd / system / <имя цели> .target
на /etc/systemd/system/default.target
. Загрузка из живого означает, что вы полностью игнорируете установленную ОС и вместо этого используете живую ОС, но по-прежнему можете получить доступ к жесткому диску.
#!/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
или что-то подобное, но вы говорите, что не не хочу этого делать.
ПРИМЕЧАНИЕ.:Что касается ваших общих вопросов о $BASHPID
, это только для чтения, и вы не можете манипулировать им. Это по дизайну.
Обычно мой общий совет заключается в том, что когда вы дойдете до такого уровня сложности с Bash-скриптами, как этот, пора переходить на Python, Ruby и т. д.
Кажется, я не понимаю, в чем проблема, у меня это работает:
$ cat subby.bash
#!/bin/bash
function foo() {
local bashpid_of_foo=$BASHPID
local output=blipblop
echo "foo: $bashpid_of_foo"
echo "foo: $output"
out_1=$(echo $bashpid_of_foo)
out_n=$(echo $output)
echo "out_1: $out_1"
echo "out_n: $out_n"
}
foo &
$./subby.bash
foo: 4900
foo: blipblop
out_1: 4900
out_n: blipblop
Если мы изменим это, превратив bar_1
в скрипт оболочки:
$ cat bar_1
#!/bin/bash
echo "from bar_1: $bashpid_of_foo"
И измените исходный сценарий вот так:
#!/bin/bash
function foo() {
export bashpid_of_foo=$BASHPID
local output=blipblop
echo "foo: $bashpid_of_foo"
echo "foo: $output"
out_1=$(echo $bashpid_of_foo)
out_2=$(./bar_1)
out_n=$(echo $output)
echo "out_1: $out_1"
echo "out_2: $out_2"
echo "out_n: $out_n"
}
foo &
Мы видим, что $bashpid_of_foo
правильно экспортируется в подоболочки:
$./subby.bash
foo: 5014
foo: blipblop
out_1: 5014
out_2: from bar_1: 5014
out_n: blipblop
Здесь нужно использовать export
, а не только local
, потому что в противном случае переменные окружения не будут экспортированы ни в какие дочерние элементы. Подоболочки здесь являются дочерними оболочками.
$ help export
...
Marks each NAME for automatic export to the environment of subsequently
executed commands. If VALUE is supplied, assign VALUE before exporting.