ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 12 Jul 2012, 08:12 
Offline
Nuby

Registriert: 12 Jul 2012, 08:05
Beiträge: 3
hallo.

ich habe hier ein ruby-skript. das soll u.a. ein shell-kommando ausführen und dessen ausgabe als string (bzw. array) einlesen.



result = %x(cmnd)

funktioniert genausogut wie



result = `cmnd`


jetzt soll cmnd aber eine ebene höher aufgerufen werden, also



result = `..\cmnd`


das funktioniert so nicht. wie ist die richtige syntax?

gruß

lecreuset


Zuletzt geändert von Quintus am 12 Jul 2012, 10:09, insgesamt 1-mal geändert.
Code-Tags eingefügt


Nach oben
 Profil  
 
BeitragVerfasst: 12 Jul 2012, 10:14 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
Willkommen im Forum! :)
lecreuset hat geschrieben:
das funktioniert so nicht. wie ist die richtige syntax?
Erst einmal empfehle ich dir, einen vernünftigen Syntax-Highlighter zu verwenden. Der hätte dir nämlich gezeigt, dass der Backslash in deinem Kommando als Escapesequenz ausgewertet wird (schau dir mal an, was unser CodeRay aus deinem Code macht).
Da du einen Backslash als Pfadtrenner versuchst, arbeitest du wahrscheinlich unter Windows. Ruby ist der native Pfadtrenner des Betriebssystems egal, intern arbeitet es immer mit Forward Slashes. Wenn du Backslashes verwendest (die du maskieren musst, um die Auswertung als Escapesequenz zu vermeiden), werden diese von Ruby einfach durchgereicht. Das Ergebnis ist unportabler Code, der nur unter Windows läuft.

Zwei mögliche Lösungen. Empfohlen:


result = `../cmnd`
Auch möglich, aber läuft nur unter Windows:


result = `..\\cmnd`


Vale,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
BeitragVerfasst: 12 Jul 2012, 11:32 
Offline
Nuby

Registriert: 12 Jul 2012, 08:05
Beiträge: 3
hallo quintus.

danke für die schnelle antwort!

Quintus hat geschrieben:
Erst einmal empfehle ich dir, einen vernünftigen Syntax-Highlighter zu verwenden. Der hätte dir nämlich gezeigt, dass der Backslash in deinem Kommando als Escapesequenz ausgewertet wird (schau dir mal an, was unser CodeRay aus deinem Code macht).


mein syntax highlighter taugt wohl wirklich nix, aber:

Quintus hat geschrieben:
Zwei mögliche Lösungen. Empfohlen:


result = `../cmnd`
Auch möglich, aber läuft nur unter Windows:


result = `..\\cmnd`


das haut beides nicht hin.
ich hätte vielleicht dazu sagen sollen, daß ich so ziemlich alle möglichkeiten mit . und .. und / // \ \\ schon durch hab - ganz dumm bin ich ja auch nicht ;-)

die fehlermeldung ist immer die gleiche:
C:/pfad/skript.rb:1:in ``': No such file or directory - ..\cmnd (Errno::ENOENT)
from C:/pfad/skript.rb:1
mit


result = `..\\cmnd`

bzw.
C:/pfad/skript.rb:1:in ``': No such file or directory - ../cmnd (Errno::ENOENT)
from C:/pfad/skript.rb:1
mit


result = `../cmnd`


nächster vorschlag? :-)

gruß

lecreuset


Nach oben
 Profil  
 
BeitragVerfasst: 12 Jul 2012, 11:52 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
lecreuset hat geschrieben:
das haut beides nicht hin.
Hm, ich hätte vielleicht vorher testen sollen. Na gut, dann probieren wir’s mal mit absoluten Pfadangaben.

1
2
cmnd = File.join(File.expand_path(File.join(File.dirname(__FILE__), "..")), "cmnd")
result = `#{cmnd}`
Oder schöner mit Pathname:

1
2
3
require "pathname"
cmnd = Pathname.new(__FILE__).dirname.parent.expand_path + "cmnd"
result = `#{cmnd}`
Wobei man bei so einer Vollsubstitution evtl. auch über IO.popen nachdenken kann.

1
2
cmnd = Pathname.new(__FILE__).dirname.parent.expand_path + "cmnd"
IO.popen(cmnd.to_s){|io| puts io.read}


Und cmnd ist auch etwas, das Windows für ausführbar hält? Also EXE, BAT, oder so?

Disclaimer: Ich habe mit Windows relativ selten zu tun, eingefleischter Linuxler hier.

Noch ne blöde Frage: Führst du das Skript aus dem Verzeichnis aus, in dem es liegt? Sonst ist eine einfache Referenz mit .. zum Scheitern verurteilt, weil es abhängig vom aktuellen Arbeitsverzeichnis ist (und nicht von dem Verzeichnis, in dem das Skript liegt). Die absoluten Pfadangaben, die ich gerade gezeigt habe, sollten das allerdings abkönnen.

Vale,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
BeitragVerfasst: 12 Jul 2012, 12:26 
Offline
Nuby

Registriert: 12 Jul 2012, 08:05
Beiträge: 3
sorry, das funktioniert auch nicht. ich krieg jedesmal "No such file or directory".
aber immerhin wird der pfad und cmnd richtig zusammengebaut ;-)

Quintus hat geschrieben:
Und cmnd ist auch etwas, das Windows für ausführbar hält? Also EXE, BAT, oder so?


ja.

Quintus hat geschrieben:
Noch ne blöde Frage: Führst du das Skript aus dem Verzeichnis aus, in dem es liegt?


ja. allerdings liegt cmnd woanders. aber die PATH-umgebungsvariable zeigt dahin.
ich kann also ganz normal über die shell cmnd ausführen, egal in welchem pfad ich bin.
moment mal...

ich kann mir mit folgendem "trick" behelfen: ich rufe das skript von einer ebene höher auf. dann brauch ich keine pfadangabe im shell-kommando. funktioniert einwandfrei.

trotzdem würde mich interessieren, warum's mit pfad nicht geht. evtl. ein windows-problem?

danke & gruß

lecreuset


Nach oben
 Profil  
 
BeitragVerfasst: 12 Jul 2012, 12:49 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
lecreuset hat geschrieben:
ja. allerdings liegt cmnd woanders. aber die PATH-umgebungsvariable zeigt dahin.
Moment mal. Du hast also so eine Struktur:

1
2
3
wurzel/
cmnd
verzeichnis/ <=== Hier zeigt PATH hin


Und dann kannst du in CMD in einem total anderen Verzeichnis ../cmnd aufrufen? Das sollte eigentlich nicht funktionieren. PATH müsste in obigem Beispiel wurzel/ enthalten, und du müsstest cmnd ohne .. aufrufen. Das kommt mir irgendwie ziemlich komisch vor. :?:

Vale,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: