2016-07-19 8 views
0

New Ruby in erb Template-Datei erkannt, ich versuche Systembenutzer zur Liste (auf einer Zeile, durch Komma getrennt) in einer erb-Datei mit dem folgenden Code:Chef - Methode Separator kommt nicht

<% IO.readlines("/etc/passwd").each do |pwd| %><% user = pwd.split(":").first %><% users = user.split.join(",") %><%= users %><% end %> 

, aber es verbindet sich nicht mit Komma, sondern fügt die Strings nacheinander ohne Leerzeichen aus dem Array ein. Das gleiche Ergebnis, wenn ich das (",") vom Join weglasse.

Irgendeine Idee, was schief läuft, oder ein besserer Weg, dies zu tun?

Antwort

1
<%= IO.readlines('/etc/passwd').reject {|l| l.start_with?('#')}.map {|l| l.split(':')[0]}.join(',') %> 

das ist schrecklich hässlich, aber funktioniert.

Diese Zeile users = user.split.join(",") versucht, user zu teilen, die eine Zeichenfolge ist, die nur den Benutzernamen der aktuellen Iteration hat. Und weil Sie den Inhalt von users (der nur user aus dieser Iteration ist) in jeder Iteration schreiben, wird nur ohne Leerzeichen angehängt. (join ing ein einzelner String bedeutet, dass der Charakter nie eingeführt wird.)

Für Code wie dies, vor allem, da es weder Chef Umgebung noch ein ERB erfordert, ist es einfacher zu sehen, was es tut, indem es in sein eigenes Skript Datei oder mit irb laufen und dann puts Zeilen zum Debuggen hinzufügen.

+0

Nun, Ihre abscheulichen sieht prägnant und funktional zu mir. Auf meinen Punkt, wenn ich ein Trennzeichen einfüge und durch es spalte, bekomme ich das gleiche Ergebnis. zB '... <% user = pwd.split (": "). zuerst +"/"%><% users = user.split ("/"). join (", ")%> ... '. Ich habe es reduziert, weil ich gesehen habe, dass ich, als ich den Join ganz ausließ (einfach zu spalten), schien, richtiges Output zu bekommen; '[" root "] [" bin "] [" daemon "] ...' Aber deine Lösung funktioniert großartig, danke! –