Вы можете попробовать запустить скрипт в подоболочке вместо любого метода, который он использует для «изменения [каталога] в родительском объекте» (предположительно, у вас есть дочерний элемент, распечатавший команду cd
, и родительский объект сделал что-то вроде eval "$(script --print-cd)"
). Поэтому вместо (например) опции --print-cd
добавьте параметр --subshell
, который запускает новый экземпляр $SHELL
.
d=/path/to/some/dir
#...
cd "$d"
#...
if test -n "$opt_print_cd"; then
sq_d="$(printf %s "$d" | sed -e "s/'/'\\\\''/g")"
printf "cd '%s'\n" "$sq_d"
elif test -n "$opt_subshell"; then
exec "$SHELL"
fi
Если вы не можете редактировать сам скрипт, вы можете создать оболочку (при условии, что у вас есть разрешение на создание новых постоянных файлов на «сервере»):
#!/bin/sh
script='/path/to/script'
print_cd=
for a; do test "$a" = --print-cd && print_cd=yes && break; done
if test -n "$print_cd"; then
eval "$("$script" ${1+"$@"})" # use cd instead of eval if the script prints a bare dir path
exec "$SHELL"
else
exec $script" ${1+"$@"}
fi