Esse é um recurso documentado.
Se você executar o bash por meio de um link simbólico chamado sh
, o bash será iniciado no sh
modo de compatibilidade.
De man bash
:
Se o bash for chamado com o nome sh, ele tentará imitar o comportamento de inicialização das versões históricas do sh o mais próximo possível, enquanto estiver em conformidade com o padrão POSIX. Quando chamado como um shell de login interativo ou não-interativo com a opção --login, ele primeiro tenta ler e executar comandos de / etc / profile e ~ / .profile, nessa ordem. A opção --noprofile pode ser usada para inibir esse comportamento. Quando chamado como um shell interativo com o nome sh, o bash procura a variável ENV, expande seu valor se for definido e usa o valor expandido como o nome de um arquivo para ler e executar. Como um shell chamado sh não tenta ler e executar comandos de outros arquivos de inicialização, a opção --rcfile não tem efeito. Um shell não interativo chamado com o nome sh não tenta ler outros arquivos de inicialização. Quando chamado como sh, o bash entra no modo posix após a leitura dos arquivos de inicialização.
Como um programa sabe qual nome foi usado para iniciá-lo?
Se for um programa de CA, ele pode inspecionar argv[0]
. Se é um shell ou script perl, ele pode inspecionar $0
.
Como exemplo, vamos considerar este simples script de shell:
$ cat utc
#!/bin/sh
case "${0##*/}" in
utc) date -u ;;
et) TZ=US/Eastern date ;;
esac
$0
é o nome pelo qual o script foi chamado. ${0##*/}
é o nome que o script foi chamado com qualquer nome de diretório removido.
Vamos criar este link simbólico:
ln -s utc et
Portanto, utc
e et
ambos executam o mesmo executável, mas fornecem resultados diferentes. Quando executado como utc
, gera tempo universal. Quando executado como et
, é emitido no horário do leste dos EUA. Por exemplo:
$ utc
Wed Jul 20 18:14:18 UTC 2016
$ et
Wed Jul 20 14:14:20 EDT 2016