Как получить сценарий 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/$/\"/'