WinFuture-Forum.de: Beliebiges Verschachteln in Bash - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Beliebiges Verschachteln in Bash


#1 _Sworddragon_

  • Gruppe: Gäste

geschrieben 10. Dezember 2012 - 11:56

Bei Verschachtelungen in Bash mit Zitatstrichen bin ich auf ein paar Probleme gestoßen, die ich nicht lösen kann:

mkdir '/tmp/test 1'


Bis hierhin ist es noch einfach. Da das Verzeichnis ein Leerzeichen hat, muss es in Anführungs- oder Zitatstrichen stehen. Alternativ hätte ich auch nur ein Backslash vor dem Leerzeichen machen können. Da ich aber wissen möchte, wie das bei einer tieferen Verschachtelung aussieht, beschränke ich mich mal nur auf die Zitatstriche. Bei der 1. Verschachtelung gibt es schon das 1. Problem:

sworddragon@ubuntu:~$ bash -c 'mkdir '\'/tmp/test 1\'''
1': -c: Zeile 0: Dateiende beim Suchen nach `'' erreicht.
1': -c: Zeile 1: Syntax Fehler: Unerwartetes Dateiende.



Seltsamerweise funktioniert es, wenn ich anstatt bash den x-terminal-emulator (lxterminal in meinem Fall) benutze:

x-terminal-emulator -e 'mkdir '\'/tmp/test 1\'''



Um erstmal zum 1. Problem zu kommen (da das eine Abhängigkeit ist), wieso funktioniert das nicht mit bash -c?

Dieser Beitrag wurde von Sworddragon bearbeitet: 10. Dezember 2012 - 19:56

0

Anzeige



#2 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 10. Dezember 2012 - 19:09

Hast du mal statt Hochkommas Anführungsstriche probiert?
0

#3 _Sworddragon_

  • Gruppe: Gäste

geschrieben 10. Dezember 2012 - 19:55

Da kommt bei bash -c das Selbe raus:

sworddragon@ubuntu:~$ bash -c "mkdir "\"/tmp/test 1\"""
1": -c: Zeile 0: Dateiende beim Suchen nach `"' erreicht.
1": -c: Zeile 1: Syntax Fehler: Unerwartetes Dateiende.


Dieser Beitrag wurde von Sworddragon bearbeitet: 10. Dezember 2012 - 20:02

0

#4 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 10. Dezember 2012 - 20:17

Du musst die Leerzeichen escapen, also z.B:
bash -c "mkdir -p foo\ /bar\ 1" 


Abgesehen davon, warum musst du den Befehl überhaupt an bash übergeben. Kannst du ihn nicht direkt aufrufen?
0

#5 Mitglied ist offline   Stefan_der_held 

  • Gruppe: Offizieller Support
  • Beiträge: 14.289
  • Beigetreten: 08. April 06
  • Reputation: 885
  • Geschlecht:Männlich
  • Wohnort:Dortmund NRW
  • Interessen:Alles wo irgendwie Strom durchfließt fasziniert mich einfach weswegen ich halt Elektroinstallateur geworden bin :)

geschrieben 10. Dezember 2012 - 20:48

Beitrag anzeigenZitat (Sworddragon: 10. Dezember 2012 - 19:55)

Da kommt bei bash -c das Selbe raus:

sworddragon@ubuntu:~$ bash -c "mkdir "\"/tmp/test 1\"""
1": -c: Zeile 0: Dateiende beim Suchen nach `"' erreicht.
1": -c: Zeile 1: Syntax Fehler: Unerwartetes Dateiende.





Bin zwar Bash-Seitig nicht so auf dem laufenden... ABER das hier sieht mir nicht so richtig aus:

bash -c "mkdir "\"/tmp/test 1\"""


wenn ich das richtig in Erinnerung habe müsste der Code-Schnippsel doch so aussehen:

bash -c "mkdir '\'/tmp/test 1\"


weil sonst der Script nach

bash -c "mkdir"


enden würde (der Rest wird nicht ausgewertet).

Wie gesagt: bin aber da etwas aus der Übung....
0

#6 _Sworddragon_

  • Gruppe: Gäste

geschrieben 11. Dezember 2012 - 07:53

Beitrag anzeigenZitat (Witi: 10. Dezember 2012 - 20:17)

Abgesehen davon, warum musst du den Befehl überhaupt an bash übergeben. Kannst du ihn nicht direkt aufrufen?


Das ist nur ein Beispiel, da ich ja wissen möchte, wie man beliebig verschachtelt.


Beitrag anzeigenZitat (Stefan_der_held: 10. Dezember 2012 - 20:48)

wenn ich das richtig in Erinnerung habe müsste der Code-Schnippsel doch so aussehen:

bash -c "mkdir '\'/tmp/test 1\"


Dann sind aber wieder Zitat- und Anführungsstriche gemischt :P
Der Befehl ist auch nicht ganz korrekt. Am besten, ich zeige euch mal das Beispiel, was ich damit machen möchte:

os.system('block -c "x-terminal-emulator -t backup -e \'burn --block 129600 --checksum 2 --password-file \'\\\'' + self.option.password_file_burn + '\\\'\' -b fast -o \'\\\'/home/sworddragon/test 1\\\'\' \'\\\'test 1\\\'\' -t /home/sworddragon/tmp -r\'" -i backup_burn')
os.system('/usr/local/share/python/backup.py --backupdir backup --password-file \'' + self.option.password_file_ftp + '\' --reconnect-bytes 51380224 --reconnect-time 150 -l 51200 &')


Das sind 2 Zeilen aus einem Python-Script. Ich würde gerne den Befehl aus der 2. Zeile direkt nach dem Befehl "burn" aus der ersten Zeile ausführen lassen, aber nur, wenn er erfolgreich war. x-terminal-emulator unterstützt aber nicht mehrere Befehle zur Ausführung, weswegen das Ganze dann in ein bash -c gepackt werden muss. Zudem hätte ich es wegen der Einheitlichkeit gerne, wenn ich die Anführungsstriche nicht mehr benutzen müsste.

Edit: Mit der Befehls-Substitution funktioniert das auch, was das Escapen etwas leichter macht. Aktuell sieht das dann so aus:

os.system('block -c "$(x-terminal-emulator -t backup -e "$(echo burn --block 129600 --checksum 2 --password-file \\\'' + self.option.password_file_burn + '\\\' -b fast -o \\\'/home/sworddragon/test 1\\\' \\\'test 1\\\' -t /home/sworddragon/tmp -r)")" -i backup_burn')
os.system('/usr/local/share/python/backup.py --backupdir backup --password-file \'' + self.option.password_file_ftp + '\' --reconnect-bytes 51380224 --reconnect-time 150 -l 51200 &')


Allerdings scheitert es wieder, sobald ich versuche bash -c dort zu benutzen.

Dieser Beitrag wurde von Sworddragon bearbeitet: 11. Dezember 2012 - 09:05

0

#7 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 12. Dezember 2012 - 18:13

Ich wiederhole mich jetzt einfach mal. :)

Zitat

Du musst die Leerzeichen escapen

0

#8 _Sworddragon_

  • Gruppe: Gäste

geschrieben 12. Dezember 2012 - 23:20

Beitrag anzeigenZitat (Witi: 12. Dezember 2012 - 18:13)

Ich wiederhole mich jetzt einfach mal. :)


Das möchte ich ja auch vermeiden, vor allem wird das dann bei Varialen ein etwas größerer Aufwand, da wären dann Anführungs- oder Zitatstriche die einfachere Möglichkeit. Bei meinem Fortschritt oben habe ich übrigens festgestellt, dass dort ein echo in der Subshell fehlt (und dementsprechend eine Stufe weitere Backslashes für das Escapen in den betroffenen Subshells nötig ist). So wie es aussieht kann man aber so Elternprozesse ohne Probleme beenden, aber das ist ein anderes Thema :)

Mein Script funktioniert jetzt so, dass ich den 2. Befehl nicht mehr in der Subshell vom 1. Befehl benötige, da ich ein bisschen was allgemein am Code geändert habe. Im Prinzip muss ich jetzt also nicht mehr weiter verschachteln, falls aber trotzdem jemand zufällig weiß, wie man das endlos mit Bash machen kann, dann nur raus damit :P

Dieser Beitrag wurde von Sworddragon bearbeitet: 12. Dezember 2012 - 23:21

0

#9 Mitglied ist offline   nobody is perfect 

  • Gruppe: VIP Mitglieder
  • Beiträge: 5.724
  • Beigetreten: 13. Oktober 06
  • Reputation: 315
  • Geschlecht:Männlich
  • Wohnort:Köln

geschrieben 12. Dezember 2012 - 23:25

Beitrag anzeigenZitat (Witi: 12. Dezember 2012 - 18:13)

Ich wiederhole mich jetzt einfach mal. :)

@Witi

https://www.winfutur...fault/smile.gif


da macht das Forum immer noch Mecker :rolleyes:
0

#10 Mitglied ist offline   DerTommy22 

  • Gruppe: aktive Mitglieder
  • Beiträge: 202
  • Beigetreten: 05. Januar 12
  • Reputation: 17

geschrieben 13. Dezember 2012 - 08:50

Zitat

falls aber trotzdem jemand zufällig weiß, wie man das endlos mit Bash machen kann, dann nur raus damit
Die simpelste Lösung ist, einfach bei (in deinem Falle) Python zu bleiben und es gleich richtig zu machen. Aus Python heraus eine Shell zu starten, die wiederum ein Pythonscript (backup.py) lädt ist total Banane.

Wenn du das, warum auch immer, wirklich so machen willst, dann schmeiss die ganzen Parameter erst in eines der zig Module die extra dafür gemacht sind. Spätestens ab Level 3 wird das sonst ein unlesbares und unwartbares \-Monster.
@EA Sports: Ich will wieder Hallenfußball ala FIFA98 :(
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0