Bash command escape

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Liebe Community,

    ich habe ein kleines Problem mit Bash, ich hoffe ihr könnt mir helfen. Wie beomme ich die rot markierten ' weg?

    Bash
    #!/bin/bash
    set -x
    mv \"/home/khad\" \"/home/kdh\"
    set +x
    exit

    Output:
    ++ '"/home/khad"' '"/home/kdh"'
    MailDrop.sh: line 3: "/home/khad": No such file or directory
    + mv
    mv: missing file operand
    Try 'mv --help' for more information.
    + set +x

    Process finished with exit code 0

  • Hallo Hannes,

    wozu verwendest Du überhaupt die Escape-Zeichen? Ohne sie funktioniert's ja...

    Code
    ~$ touch 1
    ~$ mv 1 2
    ~$ rm 2
    ~$ touch 1
    ~$ mv "1" "2"
    ~$ rm 2
    ~$ touch 1
    ~$ mv \"1" \"2"
    mv: Fehlender Zieldatei‐Operand hinter »"1 "2“
    „mv --help“ liefert weitere Informationen.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (21. Februar 2017 um 10:31)

  • Ja es würde funktionieren, aber es wird mv /home/foo /home/bar ausgeführt. Meine Absicht ist es aber mv "/home/foo" "/home/bar" auszuführen, für eventuelle Leerzeichen im Pfad. Ich kann mich erinnern das ich das Problem schon einmal hatte aber nicht mehr wie ich es gelöst habe.

    Einmal editiert, zuletzt von hannes123456 (21. Februar 2017 um 10:16)

  • Das Escapen der Quotes macht sie zum Teil des Pfad-/Dateinamens. Lass die Backslashes weg, gut.

    Code
    mv "foo" "bar"


    macht genau was du willst.

    Wenn du nichts zu sagen hast, sag einfach nichts.

  • Hallo Hannes,

    wie aus meinem ersten Post zu entnehmen ist: Lasse das Zeichen

    Code
    \

    weg. Die Anführungszeichen reichen vollkommen, um Pfad und Datei inkl. Leerzeichen einzufassen. Auch wenn Leerzeichen in Verzeichnis- und Dateinamen sehr fehlerträchtig sind, wie Du gerade leidvoll erfahren musstest.

    Die Nutzung von \ brauchst Du nur, wenn Du dieses mv-Kommando von einer Programmiersprache aus aufrufen möchtest. Aber nicht innerhalb von BASH.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (21. Februar 2017 um 10:39)

  • Wenn Du in Deinem Skript die Anführungszeichen ohne escape-Zeichen drinlässt, funktioniert das auch mit Leerzeichen im Dateinamen.

    Edit: Man sollte die Seite neu laden, bevor man in einem Fenster antwortet, das man schon länger offen hat...

    Einmal editiert, zuletzt von Manul (21. Februar 2017 um 10:36)

  • Hallo Manul,


    Edit: Man sollte die Seite neu laden, bevor man in einem Fenster antwortet, das man schon länger offen hat...


    Ach, komm! ;)

    Wenn drei Leute unabhängig voneinander fast das Gleiche von sich geben, dann erhöht das unglaublich die Glaubwürdigkeit! :thumbs1:

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (21. Februar 2017 um 10:47)

  • Zusätzlich zu dem was hier bereits erwähnt wurde:

    Code
    mv /tmp/bla\ blub /tmp/burb

    Dh. das Leerzeichen escapen. Wenn man in der Konsole /tmp/bla<TAB> drückt wird das auch automatisch gemacht...

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!