Ваша оболочка делает это, чтобы помочь вам редактировать командные строки.
Библиотека readline bash сохраняет / восстанавливает режимы терминала. Вы можете увидеть это в функциях rl_prep_terminal
и rl_deprep_terminal
, вызываемых косвенно из edit_and_execute_command
.
Вот один из способов добиться этого:
$ cat parent.sh
#!/bin/sh
echo parent.sh running
./child.sh
$ cat other.sh
#!/bin/sh
echo other.sh running
./child.sh
$ cat child.sh
#!/bin/sh
parent="$(ps -o comm= -p $PPID)"
if [ "$parent" != parent.sh ]; then
echo this script should be directly executed by parent.sh, not by $parent
exit 1
fi
echo "child.sh proceeding"
$ ./parent.sh
parent.sh running
child.sh proceeding
$ ./other.sh
other.sh running
this script should be directly executed by parent.sh, not by other.sh
Обратите внимание, что это только проверка того, является ли непосредственный родительский процесс ожидаемым. Если вам нужно углубиться в иерархию процессов, вам нужно адаптировать скрипт, чтобы подняться по родительским отношениям.
Альтернативным способом может быть экспорт пользовательской переменной и проверка, установлена ли она в дочерних процессах.
Ни один из этих методов не является действительно безопасным, поскольку есть простые способы подделать имя процесса или установить любую переменную.