Esse é um recurso documentado.
Se você executar o bash através de um link simbólico chamado sh
, o bash iniciará no modo de compatibilidade sh
.
De man bash
:
If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well. When invoked as an interactive login shell, or a non-interactive shell with the --login option, it first attempts to read and execute commands from /etc/profile and ~/.profile, in that order. The --noprofile option may be used to inhibit this behavior. When invoked as an interactive shell with the name sh, bash looks for the variable ENV, expands its value if it is defined, and uses the expanded value as the name of a file to read and execute. Since a shell invoked as sh does not attempt to read and execute commands from any other startup files, the --rcfile option has no effect. A non-interactive shell invoked with the name sh does not attempt to read any other startup files. When invoked as sh, bash enters posix mode after the startup files are read.
Como um programa sabe qual nome foi usado para iniciá-lo?
Se for um programa c, ele pode inspecionar argv[0]
. Se for um script shell ou 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
executam o mesmo executável, mas fornecem resultados diferentes. Quando executado como utc
, ele exibe o horário universal. Quando executado como et
, sai a hora da Costa Leste dos EUA. Por exemplo:
$ utc
Wed Jul 20 18:14:18 UTC 2016
$ et
Wed Jul 20 14:14:20 EDT 2016