Wie kann ich in csh/tcsh geschweifte Klammern in einen Befehl einbauen, der mit eval verarbeitet wird?

Wie kann ich in csh/tcsh geschweifte Klammern in einen Befehl einbauen, der mit eval verarbeitet wird?

Um es genauer zu sagen: Die Situation ist folgende.

Ich versuche, Moduldateien (also vom Typ, der vom Paket „Environment-Modules“ verwendet wird) vorzubereiten, um Umgebungen und Aliase für Drittanbietersoftware einzurichten. Insbesondere einige der Aliase bereiten mir Kummer. Die vom Autor bereitgestellten Shell-Ressourcendateien – von denen ich weg und hin zu einer Shell-agnostischen Umgebung möchte, daher mein Interesse an Moduldateien – legen Aliase fest, die wörtliche geschweifte Klammern enthalten. Wenn ich versuche, dieselbe Zeichenfolge in die Moduldatei einzufügen, wird der Inhalt der geschweiften Klammern erweitert.

Es scheint, dass in csh/tcsh der set-alias-Befehl der Moduldatei verarbeitet und in den von der Shell angebotenen „alias“-Befehl umgewandelt wird. Dieser wird dann mit eval wie folgt verarbeitet:

eval `alias foo 'thing to alias foo to';`

(ja, das abschließende Semikolon ist Teil des Befehls).

Ich kann keinem dieser Elemente entkommen – der Auswertung, dem Fehlen von Anführungszeichen um die ausgewertete Zeichenfolge oder den einfachen Anführungszeichen um den Aliastext – ohne eine benutzerdefinierte Version der Module zu kompilieren, was ich jedoch nur ungern tue.

Wenn der Alias ​​nun geschweifte Klammern enthält, sehe ich nicht, wie ich sie im Kontext einer Eval-Anweisung schützen kann, damit sie nicht interpretiert werden. Ich habe Backslashs von hier bis Timbuktu ausprobiert, ich habe doppelte Anführungszeichen ausprobiert, ich habe einfache Anführungszeichen ausprobiert, ich habe einfache Anführungszeichen in doppelten Anführungszeichen ausprobiert, ich habe Kombinationen der oben genannten ausprobiert. Bisher hat nichts funktioniert und es grenzt ans Absurde. Trotz ausgiebigem Googeln konnte ich keine Antworten finden.

Gibt es eine Möglichkeit, die geschweiften Klammern zu umgehen? Wenn nicht, lassen Sie es mich wissen und ich mache mit meinem Leben weiter; wenn ja und es keine Neukompilierung erfordert, wäre ich für jeden Ratschlag sehr dankbar. Danke!

Antwort1

Meine Lösung für tcsh/csh ist etwas ausführlich. Sie besteht darin, "{" in eine separate Variable einzufügen.

  set lc="{"
  set rc="}"

Dasselbe mache ich mit einem Dollarzeichen, das ich nur schwer loswerde. Sehr nützlich für reguläre Grep-Ausdrücke.

Hier ist mein Ausschneiden/Einfügen aus meiner .cshrc:

  set dollar = \$

Das Nutzungsergebnis ist wie gesagt ausführlich, funktioniert aber immerhin:

> echo "${dollar}${lc}this is inside curlybraces${rc}"
${this is inside curlybraces}

Beachten Sie, dass Sie diese zusätzlichen Anführungszeichen benötigen.

Hoffe das hilft!

Antwort2

Eine andere Lösung:

set-alias foo {env LD_LIBRARY_PATH=`printf "\044\173LD_LIBRARY_PATH\175"`:/some/path command-to-run}

Die Zahlen 044, 173 und 175 sind Oktalcodes für die ASCII-Zeichen $, { und }.

Antwort3

Verwenden2 einfache Anführungszeichenzum Schutz (Escapen) geschweifter Klammern. Möglicherweise benötigen Sie ein doppeltes Anführungszeichen ("), wenn Sie die Variable wiedergeben:

set a=''{''
echo "$a"

Außerdem kann echo innerhalb von Backquotes ( ) mit den Escape-Klammern verwendet werden:

set b = " COMMANDS `echo ''{''` MORE COMMANDS `echo ''}''` "  
echo "$b"

verwandte Informationen