PID фоновой функции, F, в командах, вызываемых в подоболочках внутри F

У вас должна быть возможность изменить уровень выполнения, поскольку уровень выполнения по умолчанию должен быть установлен в / etc / inittab или символьную ссылку с / lib / systemd / system / <имя цели> .target на /etc/systemd/system/default.target . Загрузка из живого означает, что вы полностью игнорируете установленную ОС и вместо этого используете живую ОС, но по-прежнему можете получить доступ к жесткому диску.

0
27.07.2018, 10:54
2 ответа
#!/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или что-то подобное, но вы говорите, что не не хочу этого делать.

1
28.01.2020, 02:31

ПРИМЕЧАНИЕ.:Что касается ваших общих вопросов о $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.
1
28.01.2020, 02:31

Теги

Похожие вопросы