Я не могу воспроизвести упомянутую вами проблему с паролем, отображаемым в выходных данных команды 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
Что происходит в первом случае:
После того, как последняя команда в сценарии запущена в фоновом режиме, оболочка, выполняющая сценарий, немедленно завершает работу. Этот процесс оболочки был родительским процессом для трех программ, запущенных из сценария. Теперь, когда их родительский процесс завершился, процесс PID -1(init
или systemd
часто в настоящее время )становится их родительским процессом.
Связь между терминалом и программами, запущенными из скрипта, исчезла, потому что терминальная программа больше не является их (великим )родительским процессом.
Что происходит во втором случае:
После последнего фонового процесса сценарий остается активным для запуска цикла. Когда терминал выходит, он отправляет SIGHUP своим дочерним процессам; оболочка, являющаяся его дочерним элементом, передает этот сигнал своим дочерним процессам (вашим программам ).
Действием по умолчанию, когда процесс получает сигнал HUP, является выход. По-видимому, VSCode
игнорирует SIGHUP или fork()
находится вдали от своего родительского процесса, поэтому на него это не влияет.