Questa è una funzionalità documentata.
Se si esegue bash tramite un collegamento simbolico denominato sh
, bash verrà avviato in sh
modalità compatibilità.
Da man bash
:
Se bash viene invocato con il nome sh, cerca di imitare il comportamento di avvio delle versioni storiche di sh il più vicino possibile, pur rispettando lo standard POSIX. Quando viene invocato come shell di login interattivo o come shell non interattiva con l'opzione --login, tenta innanzitutto di leggere ed eseguire i comandi da / etc / profile e ~ / .profile, in questo ordine. L'opzione --noprofile può essere utilizzata per inibire questo comportamento. Quando viene invocato come shell interattiva con il nome sh, bash cerca la variabile ENV, espande il suo valore se è definito e utilizza il valore espanso come nome di un file per leggere ed eseguire. Poiché una shell invocata come sh non tenta di leggere ed eseguire comandi da altri file di avvio, l'opzione --rcfile non ha alcun effetto. Una shell non interattiva invocata con il nome sh non tenta di leggere altri file di avvio. Quando viene invocato come sh, bash entra in modalità posix dopo la lettura dei file di avvio.
Come fa un programma a sapere quale nome è stato usato per avviarlo?
Se è un programma CA, può ispezionare argv[0]
. Se è uno script shell o perl, può controllare $0
.
Ad esempio, consideriamo questo semplice script di shell:
$ cat utc
#!/bin/sh
case "${0##*/}" in
utc) date -u ;;
et) TZ=US/Eastern date ;;
esac
$0
è il nome da cui è stato chiamato lo script. ${0##*/}
è il nome che è stato chiamato lo script con tutti i nomi di directory rimossi.
Creiamo questo link simbolico:
ln -s utc et
Quindi, utc
e et
entrambi gestiscono lo stesso eseguibile ma forniscono risultati diversi. Quando eseguito come utc
, emette tempo universale. Se eseguito come et
, viene emesso il fuso orario degli Stati Uniti orientali. Per esempio:
$ utc
Wed Jul 20 18:14:18 UTC 2016
$ et
Wed Jul 20 14:14:20 EDT 2016