Что эквивалентно pathmunge () в csh?

533
clacke

В bash, общая функция, реализованная, например, в / etc / bashrc, это pathmunge(), которая добавляет или добавляет путь к нему, PATHесли он еще не указан среди элементов в PATH.

Пример:

$ 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 

Наивный способ добавить путь будет следующим:

$ 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 

Я очень мало знаю о csh, и я просто хочу сделать эту простую вещь: добавить путь в список, если его там еще нет. Я знаю, что csh использует, pathа не PATHявляется правильным массивом csh.

Возможно, в csh есть какая-то функция массива, if !(foobar in $path) then blahкоторая делает эту функцию pathmunge()ненужной. В этом случае это правильный ответ.

-1
«Не используйте csh» - это автоматический -1 ... clacke 9 лет назад 0
Если вы `echo $ PATH | grep / home / me / bin`, тогда вы можете проверить код возврата и добавить новый путь, только если он ненулевой (то есть строка не найдена). AFH 9 лет назад 1
@clacke ставить в качестве примера «пример автоматически -1» не конструктивно. В вопросе говорится, что вы хотели бы использовать `csh`; если кто-то спросит, какова ваша цель (если она не указана в вопросе), вы можете получить ответы, которые лучше, чем использование этой команды. Это не делает их менее действительными, но вы можете указать, что хотите использовать эту конкретную команду. Raystafarian 9 лет назад 0
Вопросы по csh везде в интернете, как правило, получают автоматическое «рассмотреть возможность использования bash», на самом деле я нашел один из самых близких к вопросу, похожим на этот. просто подавляя часть шума. clacke 9 лет назад 0
Грэппинг может легко дать ложные срабатывания, также я бы хотел, если возможно, избегать подпроцесса. Самое чистое решение для bash использует `: $ PATH:` и оператор `case`, который заставляет` *: $ 1: * `соответствовать no-op, чтобы избежать обстрела. Поскольку csh поддерживает массивы, я надеюсь, что есть реальные операторы массивов, к сожалению, man-страница и http://tcsh.org/ wiki молчат о «массиве», «списке» или «последовательности», за исключением того, что они говорят, что это или эта специальная переменная является массивом. clacke 9 лет назад 0
Если я все равно выкладываю, возможно, самый простой способ - это просто выполнить обработку в bash. :-) clacke 9 лет назад 0
Хорошо, согласно http://grymoire.com/Unix/CshTop10.txt, csh даже не поддерживает функции, так что, может быть, я уже нахожусь в затруднительном положении. clacke 9 лет назад 0

2 ответа на вопрос

0
clacke

I finally went with the solution of shelling into bash, because it doesn't seem possible to solve this within the ''csh'' language.

~/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` 
[Не в первый раз.] (Http://www-uxsup.csx.cam.ac.uk/misc/csh.html) grawity 9 лет назад 0
Да, но именно поэтому так сложно найти информацию о csh в интернете. Все указывает на то, что «считается вредным» или «10 главных причин не использовать» или «не использовать csh». :-) clacke 9 лет назад 1
0
clacke

Официальный обходной путь для управления отсутствующими массивами cshзаключается в использовании системы Modules ( пакет environment-modules в Debian).

Похожие вопросы