Was ist das Äquivalent von pathmunge () in csh?

660
clacke

In bash ist eine allgemeine Funktion pathmunge(), die zB in / etc / bashrc implementiert ist, die einen Pfad anfügt oder voranstellt, PATHfalls er nicht bereits unter den Elementen in aufgelistet ist PATH.

Beispiel:

$ echo $PATH /bin:/usr/bin $ pathmunge /home/me/bin $ echo $PATH /home/me/bin:/bin:/usr/bin $ pathmunge /home/me/bin $ echo $PATH /home/me/bin:/bin:/usr/bin 

Der naive Weg, um einen Pfad hinzuzufügen, wäre wie folgt:

$ echo $PATH /bin:/usr/bin $ PATH=/home/me/bin:$PATH $ echo $PATH /home/me/bin:/bin:/usr/bin $ PATH=/home/me/bin:$PATH $ echo $PATH /home/me/bin:/home/me/bin:/bin:/usr/bin 

Ich weiß sehr wenig über csh und möchte einfach diese einfache Sache tun: Fügen Sie einer Liste einen Pfad hinzu, falls dieser nicht bereits vorhanden ist. Ich bin mir bewusst, dass csh patheher als verwendet PATHund das ist ein richtiges csh-Array.

Vielleicht hat csh eine solche Array-Funktion if !(foobar in $path) then blah, die eine Funktion pathmunge()unnötig macht. In diesem Fall ist das die richtige Antwort.

-1
"Betrachten Sie nicht csh verwenden" ist eine automatische -1 ... clacke vor 9 Jahren 0
Wenn Sie $ PATH | grep / home / me / bin`, dann können Sie den Rückkehrcode überprüfen und den neuen Pfad nur hinzufügen, wenn er nicht null ist (dh Zeichenfolge nicht gefunden). AFH vor 9 Jahren 1
@clacke Das Setzen von "Beispiel ist automatisch -1" in den Kommentaren ist nicht konstruktiv. Die Frage gibt an, dass Sie `csh` verwenden möchten. Wenn jemand fragt, wozu Sie bestimmt sind (falls dies nicht in der Frage beschrieben ist), erhalten Sie möglicherweise Antworten, die besser sind, als diesen Befehl zu verwenden. Dadurch werden sie nicht weniger gültig. Sie können jedoch angeben, dass Sie diesen bestimmten Befehl verwenden möchten. Raystafarian vor 9 Jahren 0
csh-Fragen überall im Internet neigen dazu, eine automatische "Überlegungen zur Verwendung von Bash" zu erhalten, in der Tat fand ich eine der naheliegendsten Fragen zu einer ähnlichen Frage. nur einige der Geräusche vorwegnehmen. clacke vor 9 Jahren 0
Grepping kann leicht Fehlalarme ausgeben, außerdem möchte ich nach Möglichkeit nicht in einen Unterprozess gehen. Die sauberste bash-Lösung verwendet `: $ PATH:` und eine `case`-Anweisung, die` *: $ 1: * `mit einem No-Op übereinstimmt, um ein Austeilen zu vermeiden. Da csh Arrays unterstützt, hoffe ich, dass es tatsächlich Array-Operatoren gibt. Die Manpage und http://tcsh.org/wiki sind leider für "array", "list" oder "sequence" stumm, mit der Ausnahme, dass sie dies oder das sagen diese spezielle Variable ist ein Array. clacke vor 9 Jahren 0
Wenn ich sowieso ausschieße, ist es am einfachsten, die Bearbeitung in bash vorzunehmen. :-) clacke vor 9 Jahren 0
Ok, laut http://grymoire.com/Unix/CshTop10.txt unterstützt csh nicht einmal Funktionen, also bin ich hier vielleicht schon ziemlich weit weg. clacke vor 9 Jahren 0

2 Antworten auf die Frage

0
clacke

Ich ging schließlich mit der Lösung des Beschusses in bash ein, weil es nicht möglich scheint, dies in der 'csh'-Sprache zu lösen.

~/bin/munge_echo:

#!/bin/bash  function munge() { case ":$1:" in *:$2:*) echo "$1" ;; ::) echo "$2" ;; *) echo "$2:$1" ;; esac }  munged="$1"  shift  while [ -n "$1" ]; do munged="$(munge "$munged" "$1")" shift done  echo "$munged" 

~/.csh:

setenv PATH `~/bin/munge_echo "$PATH" ~/.local/bin ~/bin` 
[Wäre nicht das erste Mal.] (Http://www-uxsup.csx.cam.ac.uk/misc/csh.html) grawity vor 9 Jahren 0
Ja, aber deshalb ist es auch so schwierig, Informationen zu csh im Internet zu finden. Alles führt zu "als schädlich" oder "Top-10-Gründe für die Verwendung von" oder "Erwägen, nicht zu verwenden, csh". :-) clacke vor 9 Jahren 1
0
clacke

Die offizielle Lösung für die Verwaltung fehlender Arrays cshist die Verwendung des Modules- Systems ( Umgebungsmodul- Paket unter Debian).