Quando imprimimos as configurações do console com o echo $-
comando, produzimos himBHs
por padrão. No entanto, quando executamos o mesmo comando em qualquer arquivo de script, geramos apenas hB
.
root@root:~# echo $-
himBHs
root@root:~# ./abc.sh
hB
root@root:~#
O que estou querendo saber é que, mesmo que estejamos executando o script de um /bin/bash
ambiente, por que as mesmas configurações padrão não se aplicam?
Por exemplo, quando inicio um novo processo de subshell com o comando /bin/bash
no console e listo as configurações, recebo output himBHs
.
root@root:~# /bin/bash
root@root:~# echo $-
himBHs
Quando tento executar o mesmo processo de dentro do arquivo shell , a saída que recebo é " hB ".
root@root:~# ./abc.sh
hB
Eu tentei o mesmo processo com shebang e sem o shebang, mas meu arquivo de script é bash script_file
ou ./script_file
se eu executar, dá o mesmo resultado ( hB
).
O que exatamente estou perdendo?
Porque quando você executa um script, o shell pai (aquele de onde você executa seus comandos) inicia um shell não interativo para executar seu script que tem o sinalizador interativo desativado
i
e ativa apenas duas opções-h
para localizar e lembrar comandos (hash) à medida que são procurados para execução.-B
para permitir que o shell execute expansão de chavesVocê pode ver a lista completa de
set
opções que serão vistas na saída de$-
- The Set BuiltinOutras opções disponíveis no shell interativo,
-i
para indicar a execução do shell no modo interativo-m
para permitir o controle de trabalho-H
para habilitar a!
substituição do histórico de estilosVárias configurações são habilitadas (ou desabilitadas) por padrão, dependendo se o Bash está sendo executado interativamente, no modo POSIX ou outras coisas. Por exemplo, a partir da saída de
help set
:Ou:
Acontece que para um Bash interativo e não-POSIX, as opções habilitadas são
himBHs
(-i
é para o modo interativo,-s
é para ler comandos da entrada padrão, as outras opções estão listadas emhelp set
).