staging.inyokaproject.org

wc -w mit backticks funktioniert plötzlich nicht mehr

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Erdös

Anmeldungsdatum:
28. Juni 2025

Beiträge: Zähle...

In einem Skript werden die file-Namen in einem Verzeichnis mit

1
FILES=`ls -l *.xmlmod` 

in einen Textstring geladen. Anschließend wird die Anzahl dieser Filenamen mit

1
FILECNT=`echo $FILES | wc -w`

ermittelt . Das ist nicht unbedingt so, wie man es optimal macht - ich hab's nicht selber geschrieben, hat aber 12 Jahre funktioniert. Seit letzter Woche funktioniert das auf dem Server, auf dem es 12 Jahre gelaufen ist, nicht mehr, die FILECNT.Zuweisung liefert offenbar nichts zurück, also auch nicht 0, obwohl der String FILES gefüllt ist. Man merkt es daran, dass die Abfrage

1
 if [ $COUNTER != $FILECNT ]...   

auf einen Syntaxfehler läuft, weil in $FILECNT nichts drin steht. Interessanterweise tritt der Fehler nur auf einem bestimmten Server auf, auf allen anderen Servern funktioniert das nach wie vor. Angeblich ist auf diesem Server nichts anders - es fällt nur der Zeitpunkt, ab dem der Fehelr auftritt, mit der Installation einer neuen sentinelone-Version zusammen. Die LC_ALL, LC_LANG,...-Parameter habe ich geprüft, die haben offenbar keinen Einfluss auf wc und/oder die backticks.

Hat jemand eine Idee, wo man da nachgucken könnte? (Das Skript kann man natürlich anpassen, dass es ohne die umständliche Abfrage läuft, aber damit kennt man ja noch nicht die Ursache...)

Bearbeitet von rklm:

Formatierung. Bitte beachte Forum/Syntax und nutze die Vorschaufunktion!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Herzlich willkommen hier im Forum!

Dateinamenlisten mit ls zu ermitteln ist ein altbekannter Fehler (siehe die Links in meiner Nutzerseite).

Man würde das in der bash mit Arrays lösen:

1
2
3
4
5
6
7
8
9
files=(*.xmlmod)

# nächste Zuweisung braucht man eigentlich nicht,
# weil die Anzahl redundant gespeichert wird:
# filecnt=${#files[@]}

if [ $counter -ne ${#files[@]} ]; then
  ...
fi

Du kannst so etwas debuggen, indem Du am Anfang Deines Scriptes set -x einfügst. Ich steuer das über eine Umgebungsvariable, damit ich das einfach ein- und ausschalten kann:

1
[ -z "$DEBUG" ] || set -x

Dann kannst Du das Debuggen so einschalten:

1
$ DEBUG=x dein-script arg1 arg2

Wenn Du einfach nur über die Dateien iterieren willst, reicht auch eine for-Schleife:

1
2
3
4
5
for f in *.xmlmod; do
  if [ -f "$f" ]; then
    ...
  fi
done

Dann braucht man keine bash, sondern die sh reicht.

Erdös

(Themenstarter)

Anmeldungsdatum:
28. Juni 2025

Beiträge: 2

Ja, danke, für den Tipp, aber das anders zu machen ist nicht das Problem - so wie das vor 12 Jahren einer gelöst hat, würde ich das sowieso nicht machen, bei allem Respekt vor Kollegen. Das Problem ist, dass das in Produktion läuft und ich da nicht ohne weiteres testen kann, weil da zu viel dranhängt, und in allen Testumgebungen funktioniert es ja problemlos nach wie vor, auch wenn es nicht optimal ist. Deswegen wäre es wichtig, das Problem "trocken" zu lösen bzw. die Ursache zu finden, denn in diesem speziellen Skript kann ich das, wenn auch aufwändig wegen der Testerei, ändern, aber möglicherweise wirkt sich das ja noch in anderen Skripten aus, wo es noch keiner gemerkt hat oder die noch nicht gelaufen sind.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Ja, dann nimm die Option mit der Debug-Ausgabe. Ggf. kannst Du ja auch Stderr in eine Datei umleiten:

1
2
set -x
exec 2> /tmp/trace.txt
Antworten |