Todas as opções de shell não são herdadas por scripts?

1

Se eu executar set -x e, em seguida, executar um script em um shell, a opção definida por set -x não funcionará dentro do script.

Eu queria saber se todas as opções de shell não são herdadas por scripts?

Eu não achei isso é mencionado no manual bash. O único relevante que encontrei é "Salvo indicação em contrário, os valores são herdados do shell". Então eu acho que as opções de shell são herdadas. Eu sinto falta no manual?

Eu li uma pergunta relacionada que perguntou como permitir que os scripts herdam as opções do shell. Eu estava me perguntando se e por que, em vez de como.

Obrigado.

When a simple command other than a builtin or shell function is to be executed, it is invoked in a separate execution environment that consists of the following. Unless otherwise noted, the values are inherited from the shell.

• the shell’s open files, plus any modifications and additions specified by redirections to the command

• the current working directory

• the fi le creation mode mask

• shell variables and functions marked for export, along with variables exported for the command, passed in the environment (see Section 3.7.4 [Environment], page 37)

• traps caught by the shell are reset to the values inherited from the shell’s parent, and traps ignored by the shell are ignored A command invoked in this separate environment cannot aff ect the shell’s execution environment.

    
por Tim 19.08.2017 / 21:30

2 respostas

2

No caso de bash , isso depende se $SHELLOPTS está no ambiente ou não.

bash-4.4$ export SHELLOPTS
bash-4.4$ set -x
bash-4.4$ bash -c 'echo x'
+ bash -c 'echo x'
+ echo x
x

Veja como o bash -c 'echo x' herdou a opção xtrace . Para as opções definidas por shopt , é o mesmo, mas com a variável $BASHOPTS .

Ele é útil especialmente para a opção xtrace para depuração quando você deseja executar um script bash (ou qualquer comando executando um script bash ) e todos os outros scripts bash que ele invocar, recursivamente com xtrace (desde que nada faça set +x nesses scripts). Se o seu sh for bash , isso também os afetará, assim como o system("command line") feito em outros idiomas:

env SHELLOPTS=xtrace some-command
    
por 22.08.2017 / 00:48
2

Você poderia chamar scripts (ou um shell com uma linha de comando) explicitamente com opções:

shopt -s expand_aliases
alias shell_call='bash -$-'
shell_call /path/to/script

As alterações no script seriam passadas automaticamente para shells filho. Essa abordagem só ativa recursos, no entanto.

    
por 19.08.2017 / 22:13

Tags