C'è una domanda simile che si occupa dello scenario "wrapping", in cui si desidera sostituire, ad esempio, cdun comando che chiama l'integrato cd.
Tuttavia, alla luce di shellshock et al e sapendo che bash importa le funzioni dall'ambiente, ho fatto alcuni test e non riesco a trovare un modo per chiamare in modo sicuro l'integrato cddal mio script.
Considera questo
cd() { echo "muahaha"; }
export -f cd
Qualsiasi script chiamato in questo ambiente utilizzando cdsi interromperà (considerare gli effetti di qualcosa di simile cd dir && rm -rf .).
Ci sono comandi per controllare il tipo di comando (chiamato convenientemente type) e comandi per eseguire la versione integrata piuttosto che una funzione ( builtine command). Ma ecco, questi possono essere ignorati anche usando le funzioni
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
Produrrà quanto segue:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
Esiste un modo per forzare in modo sicuro bash a utilizzare il comando incorporato o almeno rilevare che un comando non è un comando incorporato, senza cancellare l'intero ambiente?
Mi rendo conto che se qualcuno controlla il tuo ambiente probabilmente sei fregato comunque, ma almeno per gli alias hai la possibilità di non chiamare l'alias inserendo un \prima.
envnon viene ridefinito anche come funzione. Questo è terrificante. Ho pensato per la prima volta che i caratteri speciali avrebbero aiutato: chiamare con un percorso completo che includesse /, usando .come sorgente e così via. Ma quelli possono anche essere usati per i nomi delle funzioni! È possibile ridefinire qualsiasi funzione desiderata, ma è difficile tornare a chiamare il comando originale.
#/bin/shse questa non è la shell interattiva predefinita.
envcomando prima, in questo modo:env -i <SCRIPT.sh>