Ich habe ein einfaches Bash-Skript, das 4 Wörter zufällige Passphrasen aus einer Liste von Tausenden von Wörtern generiert. Jetzt bin ich mir nicht sicher, ob es wirklich sicher oder effizient für meinen persönlichen Gebrauch ist, lassen Sie mich wissen, wenn Sie über Verbesserungen nachdenken. Aber das ist nicht der Hauptpunkt. Check it out ->Warum die gleiche Funktion oft mit verschiedenen Argumenten aufrufen ist langsamer
Also, wenn ich es in meinem Laptop laufen, die Ein- und Ausgabe wie folgt aussieht:
time sh genpass
astrology cringe tingling massager
real 0m0.319s
user 0m0.267s
sys 0m0.077s
Ein zweites Mal:
$ time sh genpass
prankish askew siren fritter
real 0m0.318s
user 0m0.266s
sys 0m0.077s
kann manchmal ganz lustig sein.
Wie auch immer, dies ist das Skript:
# EDITABLES ###########################################
target="/path/to/my/wordList.txt"
# END EDITABLES #######################################
getWordList() {
case $1 in
"verb") mawk '/ing$|ed$|en$/ {print $2}' $target ;;
"adjective") mawk '/y$|ish$/ {print $2}' $target ;;
"noun") mawk '!/ing$|ed$|en$|y$|ish$/ {print $2}' $target ;;
*) printf "%s" "'${1}' is an invalid argument." && echo && exit 1
esac
}
pickRandomLineNumber() {
# Get the list in an array
declare -a list_a=("${!1}")
# How many items in the list
local length="${#list_a[@]}"
# Generate a random number between 1 and the number of items in the list
local number=$RANDOM
let "number %= $length"
# Print the word at random line
printf "%s\n" ${list_a[@]} | mawk -v line=$number 'NR==line {print}'
}
read -ra verbList <<< $(getWordList verb)
verb=$(pickRandomLineNumber verbList[@])
read -ra adjectiveList <<< $(getWordList adjective)
adjective=$(pickRandomLineNumber adjectiveList[@])
read -ra nounList <<< $(getWordList noun)
noun1=$(pickRandomLineNumber nounList[@])
noun2=$(pickRandomLineNumber nounList[@])
printf "%s %s %s %s\n" "${adjective}" "${noun1}" "${verb}" "${noun2}"
sehen, wo ich für jede Art von Wort ein Array erstellen habe? 3 Arten, 3 Arrays. Nun, ich dachte darüber nach, diesen Code in einer Funktion zu bekommen, also müsste ich diese Funktion nur 4 Mal aufrufen, eine für jedes meiner 4 Wörter, mit einem anderen Argument. Ich dachte wirklich, es wäre schneller. Hier
ist die Codeänderung:
# EDITABLES ###########################################
target="/path/to/my/wordList.txt"
# END EDITABLES #######################################
getWordList() {
case $1 in
"verb") mawk '/ing$|ed$|en$/ {print $2}' $target ;;
"adjective") mawk '/y$|ish$/ {print $2}' $target ;;
"noun") mawk '!/ing$|ed$|en$|y$|ish$/ {print $2}' $target ;;
*) printf "%s" "'${1}' is an invalid argument." && echo && exit 1
esac
}
pickRandomLineNumber() {
# Get the list in an array
declare -a list_a=("${!1}")
# How many items in the list
local length="${#list_a[@]}"
# Generate a random number between 1 and the number of items in the list
local number=$RANDOM
let "number %= $length"
# Print the word at random line
printf "%s\n" ${list_a[@]} | mawk -v line=$number 'NR==line {print}'
}
#### CHANGE ####
getWord() {
read -ra list <<< $(getWordList $1)
local word=$(pickRandomLineNumber list[@])
printf "%s" "${word}"
}
printf "%s %s %s %s\n" $(getWord adjective) $(getWord noun) $(getWord verb) $(getWord noun)
Jetzt ist hier die Eingabe/Ausgabe:
$ time sh genpass
overstay clench napping palace
real 0m0.403s
user 0m0.304s
sys 0m0.090s
Und wieder:
$ time sh genpass
gainfully cameo extended nutshell
real 0m0.369s
user 0m0.304s
sys 0m0.090s
Die Unterschiede im Timing sind nicht so groß von einem Deal, obwohl insgesamt dachte ich, es könnte definitiv schneller sein.
Also haben Sie eine Idee, warum das zweite Skript langsamer als das erste ist?
Natürlich „, Astrologie "und" overstay "sind keine Adjektive. Deine Regeln müssen angepasst werden. – tripleee
Ist nicht wirklich wichtig, die Zufälligkeit ist wichtig. Ich hätte diese "Verb - Adj - Substantiv" - Sache tatsächlich überspringen und das Skript nur 4 völlig zufällige Wörter ausgeben lassen können, aber ich dachte, es wäre süß. Entweder ich passe die Regeln an, entweder werde ich sie los. Wäre sicherlich schneller, sie loszuwerden. Aber nicht so süß ... –
1. Wenn Sie so oft "awk" aufrufen müssen, dann schreiben Sie einfach das Ganze in "awk". 2. Wie auch immer, wenn Sie die gleiche Datei mehrmals analysieren, tun Sie sicherlich etwas falsch. 3. Sie dürfen nicht 'awk' verwenden, um ein zufälliges Element aus einem Array abzurufen. Das ist wirklich albern. Sie haben direkten Zugriff auf jedes Feld des Arrays. 4. Wenn Sie das Gefühl haben, dass Sie "Referenzen" brauchen (das ist, was Sie mit 'declare -a list_a = (" $ {! 1} ") tun), dann ist entweder Ihr Design falsch, oder Sie verwenden nur die falsche Sprache für den Job: Shell-Skripte sollten solche Funktionen nicht verwenden. –