преимущество выполнения команды bash [закрыто]

Используйте -h, чтобы проверить, является ли dest символической ссылкой, например, вы можете удалить все другие типы с помощью:

if ! [ -h "${dest}/${lib}" ]; then
    rm -rf "${dest}/${lib}"
fi
0
31.01.2017, 19:11
2 ответа

Запуск bash сам по себе, если вы уже используете оболочку bash , действительно дает только одно правдоподобное преимущество - новая оболочка будет иметь «чистую» среду (несмотря на любые ] экспорт с).

Однако, если вы в настоящее время используете любую другую оболочку и хотите вызвать сценарий bash , а его разрешения не установлены + x (т.е. исполняемый файл) с правильной строкой shebang, вы будет использовать bash /path/to/script.sh, чтобы гарантировать, что он работает с правильной оболочкой.

3
28.01.2020, 02:15

Запуск нового сеанса оболочки с помощью 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
3
28.01.2020, 02:15

Теги

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