Используйте -h
, чтобы проверить, является ли dest символической ссылкой, например, вы можете удалить все другие типы с помощью:
if ! [ -h "${dest}/${lib}" ]; then
rm -rf "${dest}/${lib}"
fi
Запуск bash
сам по себе, если вы уже используете оболочку bash
, действительно дает только одно правдоподобное преимущество - новая оболочка будет иметь «чистую» среду (несмотря на любые ] экспорт
с).
Однако, если вы в настоящее время используете любую другую оболочку и хотите вызвать сценарий bash
, а его разрешения не установлены + x (т.е. исполняемый файл) с правильной строкой shebang, вы будет использовать bash /path/to/script.sh
, чтобы гарантировать, что он работает с правильной оболочкой.
Запуск нового сеанса оболочки с помощью bash
(или любой другой оболочки, которую вы запускаете) устанавливает новую среду. Он унаследует любые переменные среды 1 из родительского сеанса оболочки. После выхода из нового сеанса его среда уничтожается.
Помимо использования его в качестве явного интерпретатора для выполнения сценариев (для обхода строки #!
в самом сценарии) или для выполнения определенных команд в среде bash
с bash -c
, запуск интерактивной оболочки с помощью только bash
может быть полезен для тестирования.
Я использую его постоянно, так как моя оболочка для входа - ksh93
, а не bash
, и поэтому многие вопросы здесь, кажется, касаются bash
. После того, как я проверил все, что хотел проверить, я просто выхожу из
(или Ctrl + D ) и возвращаю свой надежный сеанс ksh93
без каких-либо загрязнений. из временных переменных в моей среде.
Я бы сделал это, даже если бы мой логин был bash
, конечно.
На самом деле, у меня даже есть небольшая функция оболочки, которую я использую для запуска чистого сеанса bash
. По сути, он запускает env -i bash
(который запускает bash
без передачи каких-либо переменных среды в новый сеанс), но также создает временный рабочий каталог. После выхода каталог удаляется функцией оболочки.
1 Переменная среды - это экспортированная переменная оболочки.
Если кому-то интересно:
function shell
{
# Starts the specified shell in a clean environment (save for HOME,
# TERM and SHELL) and with an empty temporary working directory.
# The working directory is deleted upon exiting the shell session.
# If no shell name is given, the shell is infered from $SHELL.
typeset shell="$( basename "${1:-$SHELL}" )"
typeset realshell="$( grep "^[^#].*/$shell\$" /etc/shells )"
if [[ -z "$realshell" ]] || [[ ! -x "$realshell" ]]; then
printf 'No such shell: %s\n' "$shell" >&2
return 1
fi
tmpcwd="$( mktemp -d "${TMPDIR:-/tmp}/shell-$shell.XXXXXXXX" )"
trap 'printf "Removing %s\n" "$tmpcwd" >&2; rm -rf "$tmpcwd"' EXIT
printf 'Starting %s in %s\n' "$realshell" "$tmpcwd" >&2
(
cd "$tmpcwd" &&
env -i SHELL="$realshell" \
TERM="$TERM" \
HOME="$HOME" \
"$realshell"
)
}
Использование (добавлены дополнительные символы новой строки для удобства чтения):
$ shell bash
Starting /usr/local/bin/bash in /tmp/shell-bash.mqUhTkBF
bash-4.4$ ls
bash-4.4$ env
PWD=/tmp/shell-bash.mqUhTkBF
HOME=/home/kk
TERM=rxvt
SHELL=/usr/local/bin/bash
SHLVL=1
_=/usr/bin/env
bash-4.4$ exit
exit
Removing /tmp/shell-bash.mqUhTkBF