Quando executo o comando abaixo no bash shell:
if [[ $(readonly | cut -d= -f1 | grep -qo HISTFILE && echo $?) == 0 ]]; then sudo grep -iwo "readonly HISTFILE" /etc/profile /etc/profile.d/*; else echo "HISTFILE not set or not set properly"; fi
O comando acima retorna o resultado com o que desejo, ou seja:
/etc/profile.d/os-security.sh:readonly HISTFILE
Mas quando coloco o comando acima no shell script, o resultado muda, ou seja:
HISTFILE not set or not set properly
Aqui o shell completo:
[ansible@rhel8-hardening-test ~]$ if [[ $(readonly | cut -d= -f1 | grep -qo HISTFILE && echo $?) == 0 ]]; then sudo grep -iwo "readonly HISTFILE" /etc/profile /etc/profile.d/*; else echo "HISTFILE not set or not set properly"; fi
/etc/profile.d/os-security.sh:readonly HISTFILE
[ansible@rhel8-hardening-test ~]$
[ansible@rhel8-hardening-test ~]$
[ansible@rhel8-hardening-test ~]$
[ansible@rhel8-hardening-test ~]$ cat test.sh
#!/bin/bash
if [[ $(readonly | cut -d= -f1 | grep -qo HISTFILE && echo $?) == 0 ]]; then sudo grep -iwo "readonly HISTFILE" /etc/profile /etc/profile.d/*; else echo "HISTFILE not set or not set properly"; fi
[ansible@rhel8-hardening-test ~]$
[ansible@rhel8-hardening-test ~]$
[ansible@rhel8-hardening-test ~]$
[ansible@rhel8-hardening-test ~]$ bash test.sh
HISTFILE not set or not set properly
[ansible@rhel8-hardening-test ~]$
Como posso obter o mesmo resultado que o shell atual ao usar o shell script com o comando acima?
Por padrão, o bash só lerá determinados arquivos de inicialização, como arquivos de perfil, quando o shell for interativo.
Bash em um script de shell é, por padrão, não interativo e não lê arquivos de perfil. Portanto, seus testes falham ao serem executados em um script.
Você pode forçar o bash em um script a se comportar como um shell interativo com a
#!bin/bash —-login
opção.https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html