Iniciar uma nova sessão de shell com bash
(ou qualquer shell iniciado) configura um novo ambiente. Ele herdará quaisquer variáveis de ambiente 1 da sessão de shell pai. Depois que a nova sessão sai, seu ambiente é destruído.
Além de usá-lo como intérprete explícito para executar scripts (para ignorar a #!
-line no próprio script) ou para executar comandos específicos em um bash
environment com bash -c
, inicie um shell interativo com Apenas bash
pode ser útil para testar coisas.
Eu uso o tempo todo desde que meu shell de login é ksh93
em vez de bash
, e muitas perguntas aqui parecem ser sobre bash
. Uma vez que eu testei o que quer que eu quisesse testar, eu apenas exit
(ou Ctrl + D ) e recuperei minha confiável ksh93
session sem nenhuma poluição de variáveis temporárias em meu ambiente.
Eu faria isso mesmo se meu shell de login fosse bash
, claro.
Na verdade, eu até tenho uma pequena função de shell que uso para iniciar uma sessão bash
limpa. Ele essencialmente executa env -i bash
(que inicia bash
sem transferir variáveis de ambiente para a nova sessão), mas também cria um diretório de trabalho temporário. Ao sair, o diretório é removido pela função shell.
1 Uma variável de ambiente é uma variável do shell que foi exportada.
Se alguém estiver interessado:
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"
)
}
Usando (novas linhas extras inseridas para legibilidade):
$ 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