2016-07-28 3 views
1

J'ai un script qui génère dinamiquement un autre script bash. Dans ce script heredoc il y a une boucle infinie montrant un compteur (cela fonctionne!):Bash. boucle infinie montrant un compteur et plus d'info

date1=`date +%s` 
while true; do 
    echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r"; 
done 

Cette boucle fonctionne bien si vous mettez seulement cela. Le problème est que je dois montrer non seulement le compteur. Plus d'informations sont nécessaires (certaines données statiques). Je vais mettre mon code de travail non:

#!/bin/bash 
dir="/tmp/" 
my_file="generatedscript.sh" 

rm -rf "$dir$my_file" > /dev/null 2>&1 

exec 3>"$dir$my_file" 

cat >&3 <<-'EOF' 
    #!/bin/bash 
    date1=`date +%s` 
    while true; do 
     echo -ne "Info\n" # this is the damned line, if you remove it the counter works fine 
     echo -ne "Time counter: $(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r"; 
    done 
EOF 

exec 3>&- 

xterm -hold -geometry 78x25+0+0 -T "Testing" -e "bash \"$dir$my_file\"" > /dev/null 2>&1 & 

Cela montre la fenêtre xterm avec beaucoup de lignes et la ligne Info est chevauchée avec le mot « temps » d'autre ligne. Je veux afficher la ligne Info séparément de la ligne du compteur de temps et le compteur en cours ... et une seule fois! Si vous supprimez la ligne echo -ne "Info \ n" Le compteur affiche ok, en cours d'exécution et une seule fois ... comment mettre une autre ligne différente (écho avec l'info) ci-dessus et comme une ligne fixe sans répétition? est possible? aucune idée de la façon d'atteindre cela? Je vous remercie.

+0

Vous ne savez pas pourquoi vous décrivez ici le descripteur de fichier 3; 'cat>" $ dir/$ mon_fichier "<< 'EOF' ...' est beaucoup plus simple. – chepner

+0

'echo -ne" INFO \ n "' n'est pas différent de 'echo INFO'. – chepner

+0

oui, c'est pareil ... c'était parce que j'essayais différentes choses ... sans succès. Et le chat> "$ dir/$ mon_fichier" << 'EOF' est nécessaire pour générer un script séparé de ce script. Est nécessaire ... peut-être n'est pas pertinent pour la cible de la poste ... de toute façon, savez-vous comment faire face au problème? Merci pour votre réponse. – OscarAkaElvis

Répondre

0

Déplacez simplement la ligne INFO hors de la boucle. Je préfère généralement mettre le retour chariot au début de la ligne. Ni -n ou -e est portable, donc je préfère généralement printf pour tous, mais les utilisations les plus simples de echo.

dir="/tmp/" 
my_file="generatedscript.sh" 

script="$tmp/$my_file" 
cat > "$script" <<'EOF' 
echo INFO 
date1=$(date +%s) 
while true; do 
    now=$(date +%s) 
    delta=$((now - date1)) 
    printf '\rTime counter: %s' "$(date -u --date "$delta" +%H:%M:%S)" 
done 
EOF 
chmod +x 500 "$tmp/$my_file" 
xterm -hold -geometry 78x25+0+0 -T "Testing" -e "$script" > /dev/null 
+0

Merci .. avec la ligne d'info hors de la boucle fonctionne! ... mais je pense que votre compteur a quelques secondes à gauche o_O Je pense que je vais utiliser mon compteur. En tout cas merci pour l'idée! – OscarAkaElvis

+0

et il se bloque lorsque les secondes sont plus de 24 ... xd – OscarAkaElvis