
Ich habe ein Shell-Skript, das ein solcher Header ist, der von anderen Skripten importiert werden kann
Sein Hauptziel besteht darin, die Verwendung von „*“ und „?“ als Parameter zu verbieten.
Ich habe bereits versucht:
1) Um Zugriff auf den Skriptaufruf über ~/.bash_history zu erhalten, da ~/.bash_history am Ende der Benutzersitzung aktualisiert wird, habe ich ~/.bashrc mit den folgenden Parametern geändert: shopt -s histappend, PROMPT_COMMAND="history -a;$PROMPT_COMMAND" und auch PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" ausprobiert.
Wenn ich diese Einstellung vornehme, beginnt das System, die Datei ~/.bash_history im Arbeitsspeicher zu aktualisieren. Theoretisch kann ich also den letzten vom Benutzer verwendeten Befehl abrufen (das sollte der Skriptaufruf sein) und nach einem „*“ darin suchen. Aber wie Sie vielleicht wissen, muss ein Shell-Skript den Shell-Interpreter in seiner ersten Zeile angeben, etwa: /bin/bash. Daher erstellt es jedes Mal, wenn das Skript aufgerufen wird, eine neue Shell-Sitzung, und diese neue Sitzung hat keinen Zugriff auf den Befehlsverlauf der vorherigen Sitzung: Zum Beispiel:
~>cat hist.sh
#!/bin/bash
var=$(tail -n 1 /home/$USER/.bash_history) # get the last command
echo $var
~>./hist.sh
cat hist.sh # that's the output, it shoud be ./hist.sh
Ich denke, die Datei ~/.bash_history wird erst geschrieben, wenn die Verarbeitung des Befehls abgeschlossen ist. Deshalb war ./hist.sh nicht da, aber das ist nur meine Vermutung.
2) Ich habe auch versucht, den Verlauf und die Befehle fc -l -n -0 zu verwenden (dies funktioniert derzeit in der AIX-Umgebung), aber unter Linux habe ich dasselbe Problem wie zuvor.
3) Mein letzter Versuch war das folgende Skript:
#!/bin/bash
for i in $@
do
if echo $i | grep '*' &> /dev/null
then echo "Invalid parameter *" && exit
else echo "Sucessful"
fi
done
Es funktioniert, wenn ich die Datei ./script.sh* verwende (das "" + Wörter oder "" + Wörter), aber nicht, wenn ich das "*" alleine verwende (./script.sh *), weil die Shell das * vor den if-Anweisungen auf alle Dateien des aktuellen Verzeichnisses erweitert.
Ich habe überlegt, die Anzahl der Parameter für das Skript zu begrenzen, aber da es ein für viele andere Skripte nützlicher Header sein wird, ist die Anzahl der Argumente für jeden Aufruf definitiv unbekannt.
Könnte mir jemand bei diesem Problem helfen? Ich wäre sehr dankbar!