Na interpretação deste fluxograma
Eu descobri que na festa do homem:
Quando o bash é chamado como um shell de login interativo ou como um shell não interativo com a opção --login, ele primeiro lê e executa comandos do arquivo / etc / profile, se esse arquivo existir.
Indica que os shells de logon interativo são lidos /etc/profile
(sem --noprofile)
Além disso, shells não interativos com a opção --login
read/etc/profile
Isso parece deixar alguns possíveis shells de login (nos quais $0
começa com a -
) que não são interativos (executam um script, talvez tão simples quanto date
) podem não ser lidos (fonte) /etc/profile
.
Para confirmar ou negar esta ideia:
Primeiro, tentei usar su -l -
, que inicia um shell de login com -
o caractere primeiro, mas não consigo torná-lo não interativo (e consigo apresentar os testes para sondá-lo).
Chamando algo como
$ bash -c 'date' -bash
Não relata ser um shell de logon (mesmo que o primeiro caractere seja a -
).
Tente isto para revelar os detalhes:
$ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u login_shell|| Fri Aug 19 06:32:31 EDT 2016
O
$0
tem um-
como o primeiro caractere, não hái
(interativo) no valor de,$-
mas não é relatado como umlogin_shell
(o -u). Nesse caso, o / etc / profile não foi lido, mas não tenho certeza se este é o teste certo.
Há também a menção de "conchas de login não interativas raras" nesta resposta sem ser suficientemente específico para esta pergunta.
A conclusão desse cara é que /etc/profile
é sempre lida.
Leia a tabela de resumo: os shells de login interativos e não interativos são lidos /etc/profile
E, se os exemplos desta página estiverem corretos:
Some examples
$ su bob # interactive non-login shell
$ su - bob # interactive login shell
$ exec su - bob # interactive login shell
$ exec su - bob -c 'env' # non-interactive login shell
$ ssh bob@example.com # interactive login shell, `~/.profile`
$ ssh bob@example.com env # non-interactive non-login shell, `~/.bashrc`
O teste dos exec su - bob -c 'env'
relatórios que /etc/profile
foram lidos.
Em resumo:
É possível ter um shell de logon não interativo (não chamado com --login ou -l)?
E se for verdade, está lendo o /etc/profile
arquivo?
Se o exposto acima for verdade, temos que concluir que TODAS as conchas de login [interativas (ou não)] leem / etc / profile (sem --noprofile
opção).
Nota: para detectar que o / etc / profile está sendo lido, basta adicionar no início do arquivo este comando:
echo "'/etc/profile' is being read"
--login
opção Para o segundo, se euexec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"
obtiver (codificado em C qoutes)$'/etc/profile read\nshopt -s login_shell\nbash himBH'
, é um login, mas é interativo. Precisamos de login e não interativos . O que é que estou perdendo?<<<"$-"
, que$-
é expandido pelo shell de chamada devido às aspas duplas. O shell chamado não é interativo porque seu stdin não é um tty.exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOF
para obter esta confirmação:$'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'
Então, sim, um shell de logon não interativo é possível e ainda é lido/etc/profile
. Devemos concluir que TODAS as conchas de login são lidas/etc/profile
?exec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF
:).bash
, o manuseio de arquivos de inicialização é bastante IMO, você verá que alguns sistemas o corrigiram para ter um comportamento mais razoável, adicionando ainda mais variação.Sim, são possíveis shells de login não interativos
fonte
su -c 'echo hello' -
. Que, para testar o que precisamos, deve ser escrita como:su -c 'echo $0 $-; shopt -p login_shell' -
para obter esta resposta confirmando (codificado entre aspas C):$'/etc/profile read \n -su hBc \n shopt -s login_shell'
. Isso confirma que um shell não interativo de logon foi excutado e que, no processo, / etc / profile foi lido. Obrigado.SIM.
No entanto, observe que
/etc/profile
não seria usado para um shell de login não interativo, a menos que o--login
argumento seja fornecido.Um idioma comum que chama um shell de logon não interativo é:
Mas isso sofre o fato de que
/etc/profile
não é executado.É possível alterar esse comportamento, mas envolve a personalização do código-fonte do Bash no tempo de compilação, descomentando uma opção encontrada em config-top.h :
Quando pesquisei essa
su
anomalia , descobri que outras conchas incluemzsh
edash
não têm essa discrepância.fonte