Salut,
Je me disais, que tel la RiiR, rust evenlegical task force rugissant qu'il faut tout ré-écrire en Rust, j'allais me lancer sur le créneau du BieR ; Bash In thE Rewrting; ou tout simplement ré-écrivons tout en bash.
Et je suis arrivé sur un cas pratique mignon que je pensais utiliser pour illustrer quelques bashismes (shellisme) kawai dans le process et en profiter pour évangéliser encore plus.
Le besoin
C'est une application en bash qui quand on lui donne un fichier bash en argument, la source et change le prompt de manière à suivre les exports (éventuels) que l'on a fait.
Genre, t'as tes tokens d'accès à la prod/dev/test d'un coté, et db/web de l'autre.
Et pour se faire plaisir on fait en 20 lignes une petites interfaces interactives si aucun fichier n'a été rentré pour choisir parmi les candidats dans un répertoire prédéfini.
Et comme ssh le fait et que c'est cool on prévient quand les droits sont trop lâches. Ça sert pas à grand chose, mais on fait ce que l'on peut avec ce que l'on a.
Et quand on veut sortir, Ctrl+D ou exit et on revient dans l'environnement d'avant.
Un peu comme un pushd/popd des variables d'environnement.
Ça marche …
comme annoncé. Sauf que …
ça marcherait presque
Quand on appelle l'history dans les sous shells. Et que l'on s'aperçoit que le script y est injecté, et que je ne comprends pas pourquoi. Je sais juste remédier dès que je peux. Prouvant mon ignorance certaine dans le mécanisme du she bang et son impact sur l'history.
Je pense tracer mon problème à
#!/usr/bin/env -S bash --norc -i
et ça m'inquiète de ne pas savoir plus que ça, car je montre une coupable ignorance dans un truc fondamentaux des shells : bien écrire son she bang, et anticiper ses effets.
Donc, si vous pouviez m'éclairez sur le « comment le script est in injecté dans l'history bash », je vous serais reconnaissant.
Au diable les évangélistes, et amusons nous en apprenant !
Ci suit le gist
#!/usr/bin/env -S bash --norc -i
# should not be in history
set +o history
STASH=~/.secrets
RZ="\e[0m"
GR="\e[92m"
RD="\e[91m"
HL="\e[1m"
usage() {
cat <<MAN
$0 [(-h|usage|help|env to source)]
SYNOPSIS
========
source files in a dedicated directory in order to eventually export variables
and keep track of which files where source by keeping track of them in the
prompt.
If invoked without an environment to source the command will pass in
interactive mode and prompt you for which files you can source from.
MAN
exit 1
}
[[ "$1" =~ ^(-h|help|usage)$ ]] && usage
[ -d "$STASH" ] || mkdir "$STASH"
chmod 700 "$STASH"
if [ ! -z "$1" ]; then
FOUND=
if [ -f "$1" ]; then
FILE="$1";
FOUND=1
fi
if [ -f "$STASH/$1" ]; then
FILE="$STASH/$1";
FOUND=1
fi
if [ -z "$FOUND" ]; then
echo no secret found for "$1" check ls "$STASH"
exit 1
fi
else
while [ -z "$FILE" ]; do
i=1;
for f in $STASH/*; do
if [ -f "$f" ]; then
STATUS=$( [[ $( stat --printf "%a" "$f" ) == "600" ]] \
|| echo -n "${RD}pliz chmod 600 \"$f\"" )
ff="$( basename "$f" )"
if [ "$ff" != '.' ] && [ "$ff" != '..' ]; then
printf "%3d: %-32s %s " $i "$ff" ;
echo -e "$STATUS ${RZ}"
FL[i]="$f"
i=$(( ++i ))
fi
fi
done
echo "which secret do you want?"
read choice
FILE="${FL[$choice]:-}"
done
fi
CAGE=$( basename "$FILE" )
export CAGE
source "$FILE"
PRMPT="${HL}${RD}${CAGE}${RZ}:"
( PS1="${PRMPT}$PS1" bash --norc )
unset CAGE
set -o history

Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.