Às vezes, faço coisas como iniciar um sub-shell do vim :sh
. Como sei se estou em um sub-shell, onde exit
apenas me expulsará um nível, versus estar no shell mais externo, onde exit
me desconectarei ou encerrarei minha sessão.
Existe algum tipo de totem de iniciação que eu possa girar ou algo para saber quantos níveis de profundidade eu tenho?
command-line
Wyck
fonte
fonte
echo $0
. Se for o shell de nível superior, provavelmente começará com um traço. (Isso é verdade pelo menos para o bash, e o traço significa que é um chamado shell de login.)Respostas:
Você pode usar o comando
pstree
(que vem por padrão com o Ubuntu). Aqui está um exemplo - atualmente, estou tendo apenas uma janela de terminal aberta na WSL:Dentro de um ambiente Linux / Ubuntu real, a árvore de processos será mais complicada. Podemos filtrar a árvore pela opção
-s
que mostrará os pais de um processo selecionado. Portanto, nosso comando poderia serpstree -s $$
, onde$$
está uma variável de ambiente que contém o PID atual:Referências:
Adicionar indicador ao prompt do shell: com base na idéia do @ waltinator , para ter um contador na frente do prompt para vários shells diferentes quando o nível for mais profundo do que um, adicionei as linhas, mostradas abaixo da demonstração, na parte inferior dos arquivos de comandos de execução relevantes (
~/.*rc
).Fiz testes na WSL, Ubuntu 16.04, Ubuntu 18.04 (servidor / desktop), Ubuntu 19.04, na sessão gnome-terminal, tty e ssh. Aqui está como isso funciona:
A limitação é a seguinte: o contador funciona apenas para 13 a 14 níveis de profundidade, dependendo do sistema operacional. Não pretendo investigar os motivos :)
bash
>.bashrc
:csh
etcsh
>.cshrc
:zsh
>.zshrc
:ksh
>.kshrc
:sh
que está realmentedash
no Ubuntu - aqui as coisas são um pouco complicadas e cabeadas (leia as referências abaixo para obter mais informações):Edite o
~/.profile
arquivo e adicione a seguinte linha na parte inferior:Crie o arquivo
~/.shrc
com o seguinte conteúdo, observeksh
também o seguinte$ENV
:Referências:
.profile
e.kshrc
Crie um comando que produzirá a profundidade: Outra opção é criar um comando shell que produzirá a profundidade. Para esse fim, crie o arquivo executável (portanto, ele deve estar acessível em todo o sistema):
/usr/local/bin/depth
Edite o arquivo com seu editor favorito e adicione as seguintes linhas como conteúdo:
O script acima tem duas opções
-v
ou--verbose
que produzirão uma lista dos shells envolvidos. E a outra opção que verificará se a profundidade é maior que uma e com base nisso retornaráexit 0
ouexit 1
, para que você possa usá-la dessa maneiradepth && exit
. Aqui estão alguns exemplos de uso:Comparação por outras soluções: Passei algum tempo adicional para descobrir algumas fraquezas das abordagens fornecidas aqui. Consegui imaginar os dois casos a seguir (as letras maiúsculas são necessárias para melhor destaque da sintaxe):
Quando
su
ousudo -i
está envolvido:Quando um processo em segundo plano é iniciado:
fonte
systemd───xfce4-terminal───bash───pstree
. Porque é este caminho?xfce4-terminal
, você está usando , o que lançou umbash
shell, no qual você executoupstree
, que relatou a si mesmo e a seus pais. Se você quer dizer a falta de etapas entre o systemd e o xfce4-terminal, pode ser que qualquer que seja o xfce4-terminal lançado tenha morrido ou o deserdado, caso em que seria herdado pelo init.SHLVL
? Portabilidade entre processos e sistemas, suponho, mas o pstree pode não estar instalado.$SHLVL
não é suportado por alguns shells. Mais específico, de acordo com o ambiente da demonstração acima, ele não é suportado apenas porsh
(dash
) - e esse shell não é contabilizado de maneira alguma por essa variável. Por outro lado,pstree
faz parte do pacote psmisc que também fornecefuser
,killall
e poucos outros - é o principal componente do Ubuntu - não o instalei nos sistemas mencionados nesta resposta.Verifique o valor da
SHLVL
variável do shell:Citando a partir
bash
da página de manual:Também é suportado por
zsh
.fonte
:sh
padrão é o shell de login do usuário, eu acho (é realmente uma forma abreviada de:shell
e não o nome de um binário específico do shell):sh
devim
antes de postar esta resposta, e ele fez incremento do nível de shell para mim. Meu shell de login é bash.No meu
.bashrc
, eu costumo$SHLVL
ajustar$PS1
, acrescentando+
sinais " " à minha$SUBSHELL
variável:Então, eu posso ver o quão profundo eu sou:
fonte
awk:
pgrep:
Você pode colocar uma das duas versões em um arquivo e usar o source para disponibilizar o $ DEPTH.
fonte
Você pode simplesmente usar,
ps
sem argumentos adicionais, para ver a pilha inteira do shell (incluindo a atual). Ele também mostrará todos os trabalhos em segundo plano que você iniciou, assim comops
ele próprio, mas pode fornecer uma estimativa aproximada de quão profundo você é.fonte
{ echo hello world; ps; } &
para provar aps
resposta acima.