Как получить сценарий csh из среды Bash?

Я использую оболочку bash, но некоторые из скриптов, которые мне нужны, находятся в формате csh. Может кто-нибудь сказать, как я могу получить сценарии csh из оболочки Bash?

Под источником я подразумеваю, что исходный скрипт csh должен иметь возможность устанавливать переменные среды. Итак, я хочу сделать что-то подобное в моем ~/.bashrc:

source path/to/csh_script/script.cshrc

3 ответа

bash не будет отлично запускать все сценарии csh. Могут быть некоторые основные совпадения, например, очень простые bash-скрипты будут работать в sh / dash, но если он не будет работать в bash (протестируйте с bash [file]) тогда нет. Или

  • изменить их для запуска в bash, или
  • запустите их с помощью csh, вызываемого из сценария bash, как если бы вы запускали их в терминале, чтобы они возвращали значение результата или делали то, что предполагалось. Это не оставит никаких переменных или функций доступными для основного сценария bash, как вы прокомментировали, так что вы либо

    • попросите их сделать то, что они должны делать с внешними файлами, или
    • вернуть единственное значение / строку, или, может быть,
    • относитесь к ним как к другой программе и считывайте несколько строк вывода в свой bash-скрипт.

Если вы просто просматриваете исходные переменные, теоретически можно пройти по сценарию csh построчно и добавить только переменные в текущую оболочку / скрипт bash. Что-то похожее на это:

while read line
do
[stuff with $line]
done < /path/to/[the csh script to add]

Я не знаю, как все переменные представлены в сценариях, которые вы используете, поэтому вам решать, каким должен быть [материал с $ line].

  • Если они похожи на bash, то, возможно, просто grep любых строк, которые начинаются с пробелов или символов, есть = с дополнительным количеством символов без пробелов, поэтому:

    эхо "$line" | grep '^\s*\S*=\S*'

  • или как указано выше с чем-либо после = с:

    эхо "$line" | grep '^\s*\S*=.*'

Но я думаю, что переменные csh все начинаются с set / setenv можно найти строки set/setenv, а затем выбросить set/setenv. Попробуйте как стартер:

echo "$line" | grep '^\s*\S*set.*=.*'

Это просто быстрые примеры шаблонов grep / regex, для получения дополнительной информации см. Эти и другие.

Или, если их всего несколько, просмотрите их вручную и вставьте все переменные в bash / sh-совместимые файлы, которые затем можно без проблем использовать в bash.

Линия Шебанга уже позаботится об этом за вас. Когда вы запускаете скрипт, который имеет #! /bin/csh -f в качестве первой строки система распознает #! часть как скрипт, и загрузить любой интерпретатор, указанный после него (в этом случае /bin/csh).

В качестве альтернативы, вы можете вызвать интерпретатор явно, с csh /path/to/script.csh,

Вот небольшая демонстрация. Моя интерактивная оболочка mksh и я звоню простой csh сценарий:

xieerqi:
$ cat bin/whiledemo.csh                                                                       
#! /bin/csh -f 
# demoloop.csh - Sample loop script 
set j = 1
 while ( $j <= 5 )
   echo "Welcome $j times"
   @ j++
 end

xieerqi:
$ echo $SHELL
/bin/mksh

xieerqi:
$ bin/whiledemo.csh                                                                           
Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times

xieerqi:
$ csh bin/whiledemo.csh                                                                       
Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times

Обратите внимание, что если у вас есть хотя бы один пробел перед #!, #! не будет интерпретироваться, поэтому скрипт будет работать с вашей интерактивной оболочкой, из которой вы вызываете скрипт. Естественно, вы можете ожидать сбоя скрипта из-за разного синтаксиса скрипта и того, что ожидает интерактивная оболочка. В процессе написания этого ответа я столкнулся с именно этой ошибкой.

Я не знаю csh, но у меня есть аналогичные требования для ksh. Мое хакерское решение состояло в том, чтобы

      eval source <(ksh -c ". /path/to/my_script.ksh
env|sort)

Я столкнулся с проблемами с цитированием и в итоге добавил несколько шаблонов grep после env, чтобы удалить переменные среды, которые я не хотел переносить, но это вроде как сработало.

Я нашел еще один полезный бит здесь:

https://www.theunixschool.com/2010/07/how-to-access-child-shell-env-variable.html

Этот небольшой фрагмент sed создает команды экспорта с правильными кавычками:

      sed 's/^/export /;s/=/=\"/;s/$/\"/'
Другие вопросы по тегам