$! пусто при запуске команды в bash с -c или в подоболочке

Просто добавьте это в свой unbound.conf

 # Dns over TLS
    forward-zone:
            name: "."
            forward-addr: 1.0.0.1@853
            forward-addr: 9.9.9.9@853
            forward-ssl-upstream: yes
            forward-addr: 1.0.0.1
            forward-addr: 9.9.9.9
0
19.06.2020, 12:33
2 ответа

$! будет содержать PID последнего запущенного фонового задания. (команда, оканчивающаяся на&). Вы не можете использовать его указанными способами для получения информации о других частях конвейера.

Тот факт, что ваш конвейер echo "test" | echo $!выводит число, означает только то, что вы запустили фоновое задание в какой-то момент до запуска конвейера. Выведенное число не имеет ничего общего с вашим конвейером. В новой оболочке, где фоновые задания не запущены, этот конвейер ничего не выведет.

2
18.03.2021, 23:26

$!— это PID задания, которое эта оболочка в последний раз переводила в фоновый режим. Если вы хотите что-то с ним сделать, вам обычно следует сохранить его в переменной, так как запуск другого фонового процесса перезапишет его. $!в этом отношении похож на $?, хотя перезаписывается не так быстро.

Как и в случае с любой другой переменной, если вы хотите сделать ее доступной для дочернего процесса, экспортируйте ее в среду.

background_command &
export background_command_pid=$!
…
bash -c 'echo "My background sibling process is $background_command_pid"'

Между прочим, вопреки вашему утверждению,$!сохраняется в подоболочках.

$ sleep 3 & echo $!
23791
$ { echo $! | cat; }                           
23791
$ ( echo $!; /bin/cat /dev/null; ); /bin/cat /dev/null
23791
$ echo $! $(echo $!)
23791 23791

Запуск другого экземпляра bash не является подоболочкой. Вы путаете подоболочку с дочерним процессом, который является оболочкой .

1
18.03.2021, 23:26

Теги

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