Bash ` &` поведение несовместимо, когда есть цикл в конце скрипта

Я не могу воспроизвести упомянутую вами проблему с паролем, отображаемым в выходных данных команды history .

Пароль, отображаемый в выводе из printenv и export -p , работает должным образом. Эти команды отображают переменные среды, и туда вы помещаете строку http_proxy .

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

Но вы можете перестать помещать его в переменную окружения и вместо этого использовать обычные переменные оболочки. Тогда он не будет унаследован дочерними процессами. Поскольку вы, вероятно, хотите, чтобы curl имел доступ к переменной среды, вы можете передать переменную среды только этой одной команде, а не всем остальным командам.

#!/bin/bash
echo -n "User:";
read user
echo -n "Password:";
read -s password

proxy="http://$user:$password@$domain:$portnum"

if http_proxy="$proxy" curl -silent http://www.google.com | grep authentication_failed;
then
    echo NO CONNECT
else
    echo OK
fi
1
27.02.2019, 18:45
1 ответ

Что происходит в первом случае:

После того, как последняя команда в сценарии запущена в фоновом режиме, оболочка, выполняющая сценарий, немедленно завершает работу. Этот процесс оболочки был родительским процессом для трех программ, запущенных из сценария. Теперь, когда их родительский процесс завершился, процесс PID -1(initили systemdчасто в настоящее время )становится их родительским процессом.

Связь между терминалом и программами, запущенными из скрипта, исчезла, потому что терминальная программа больше не является их (великим )родительским процессом.

Что происходит во втором случае:

После последнего фонового процесса сценарий остается активным для запуска цикла. Когда терминал выходит, он отправляет SIGHUP своим дочерним процессам; оболочка, являющаяся его дочерним элементом, передает этот сигнал своим дочерним процессам (вашим программам ).

Действием по умолчанию, когда процесс получает сигнал HUP, является выход. По-видимому, VSCodeигнорирует SIGHUP или fork()находится вдали от своего родительского процесса, поэтому на него это не влияет.

4
27.01.2020, 23:18

Теги

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