Haben Sie Anregungen, Statements oder Kommentare? Dann schreiben Sie an redaktion@linux-magazin.de. Die Redaktion behält es sich vor, die Zuschriften und Leserbriefe zu kürzen. Sie veröffentlicht alle Beiträge mit Namen, sofern der Autor nicht ausdrücklich Anonymität wünscht.
Shell-Bordmittel
12/12, S. 92: Ich habe eine Anmerkung zum Artikel Bash Bashing. Der Text und das Shellskript suggerieren, dass es nicht möglich sei, den Bash-Einzeiler »LIST=${PATH//:/ }« mit Dash-Bordmitteln nachzubilden. Das abgedruckte Awk-Skript lässt sich jedoch auch ohne irgendein externes Kommando folgendermaßen nachbilden:
LIST=$(IFS=:; for p in $PATH; do echo "$p";done)
Möchte man Leerzeichen statt Linefeeds zwischen dem Elementen (wie bei »${PATH//:/ }« ), dann geht es sogar noch einfacher:
LIST=$(IFS=:; echo $PATH)
Zugegeben, in exotischen Fällen gäbe es hier tatsächlich das übliche Shell-Problem: Steht nach Expansion der Variablen am Anfang eine Option, die der Echo-Befehl auswertet, funktioniert es nicht mehr.
Ein Testskript habe ich mitgeschickt (Listing 1), es funktioniert mindestens mit Ash, Bash, Dash, Mksh, Posh und Sash. Ersetzt man »$(…)« durch den klassischen Backtick »`…`« , dann sollte das sogar unter historischen Bourne Shells laufen.
Listing 1
$PATH aufspalten
01 LIST=$(awk '
02 BEGIN {
03 split(ENVIRON["PATH"], p, ":")
04 for (i=1; i<=length(p); i++)
05 print p[i]
06 }
07 ')
08
09 LIST2=$(IFS=:; for p in $PATH; do echo "$p"; done)
10 test "$LIST" = "$LIST2" || echo "Fehler 1"
11
12 LIST=$(/bin/bash -c 'echo "${PATH//:/ }"')
13 LIST2=$(IFS=:; echo $PATH)
14 test "$LIST" = "$LIST2" || echo "Fehler 2"
Christian Franke, per E-Mail





