Существует ли функциональная оболочка Unix?

Существует ли функциональная оболочка Unix?

Я (действительно) новичок в функциональном программировании (на самом деле имел с ним дело только при использовании Python), но, похоже, это хороший подход для некоторых задач с интенсивным использованием списков в среде оболочки.

Я бы с удовольствием сделал что-то вроде этого:

$ [ git clone $host/$repo for repo in repo1 repo2 repo3 ]

Есть ли какая-нибудь оболочка Unix с такими функциями? Или, может быть, какая-то функция, позволяющая легко получить доступ к оболочке (команды, env/vars, readline и т. д.) из Python (идея заключается в использовании интерактивного интерпретатора Python в качестве замены Bash).

РЕДАКТИРОВАТЬ:

Может быть, сравнительный пример прояснит ситуацию. Допустим, у меня есть список, состоящий изкаталог/файл:

$ FILES=( build/project.rpm build/project.src.rpm )

И я хочу выполнить очень простую задачу: скопировать все файлы врасст./И устанавливаем его в систему (это часть процесса сборки):

Используя bash:

$ cp ${files[*]} dist/
$ cd dist && rpm -Uvh $(for f in ${files[*]}; do basename $f; done))

Используя подход «pythonic shell» (осторожно: это воображаемый код):

$ cp [ os.path.join('dist', os.path.basename(file)) для файла в ФАЙЛАХ ] 'dist'

Видите разницу? Я говорю именно об ЭТОМ. Как можно не выходить из оболочки с такими встроенными вещами? Это настоящая боль обрабатывать списки в оболочке, даже если это такая распространенная задача: список файлов, список PID, список всего.

И очень, очень важный момент: использование синтаксиса/инструментов/функций, которые всем уже известны: sh и python.

IPython, кажется, движется в правильном направлении, но он раздут: если имя переменной начинается с '$', он делает это, если '$$', он делает то. Его синтаксис не является "естественным", так много правил и "обходных путей" ( [ ln.upper() for ln in !ls ] --> синтаксическая ошибка)

решение1

ЕстьСхема Shellэто, вероятно, очень близко к тому, что вы ищете. Я сам этим не пользовался.

ОБНОВЛЯТЬ :

Я только что установил и попробовал сам. Похоже, что scsh — это скорее интерактивный интерпретатор Scheme и язык сценариев, чем действительно полезная интерактивная оболочка. Вы не можете просто ввести

echo hello

синтаксис выглядит так

(run (echo hello))

и мне потребовалось несколько минут гугления, чтобы найти это. Первый примерздесьявляется:

gunzip < paper.tex.gz | detex | spell | lpr -Ppulp &

что переводится как:

(& (| (gunzip) (detex) (spell) (lpr -Ppulp)) (< paper.tex.gz))

но это не говорит вам, как управлятьпростойкоманда оболочки.

Эта запись FAQговорит:

4.6 Могу ли я использовать scsh в качестве интерактивной оболочки?

Ну, технически вы можете: просто запустите команду "scsh", и вы войдете в сеанс Scheme 48 со всеми доступными функциями scsh. Однако это определенно не подходит для интерактивной работы: нет редактирования командной строки, нет истории командной строки, нет автодополнения имен файлов/функций, нет краткого синтаксиса и т. д.

Чтобы облегчить эти проблемы, Мартин Гасбихлер и Эрик Кнауэль написали Commander S, который работает поверх scsh и обеспечивает удобную интерактивную среду. Одной из его новых особенностей является то, что он может понимать вывод многих команд Unix и позволяет пользователю просматривать и манипулировать им полезными способами. Более подробную информацию о Commander S можно найти в статье, описывающей его: http://www.deinprogramm.de/scheme-2005/05-knauel/05-knauel.pdf Инструкции по получению и установке Commander S доступны на веб-сайте scsh:http://www.scsh.net/resources/commander-s.html

Так что, возможно, это и есть настоящий ответ.

решение2

В категории прямого ответа на вопрос естьES-оболочкакоторый задуман как функциональная замена Bash, Zsh и т. д.

Во-вторых, в категории помощи в написании более функциональной стандартной оболочки рассмотрите возможность изучения техники pipemill:

who | while read username 
do
  cat <<EOF | grep $username
nic
mark
norman
keith
EOF
done | while read username
do
  echo "you have an answer on superuser.com" | mail -s "well done" $username
done

Первый цикл while является функциональным keep(передает только ненулевые значения, которые выходят из цикла), а второй — each(отображает только побочные эффекты).

Это колоссальный прирост fp в снарядах.

Можно выразить многие вещи в стиле fp в оболочке, просто это не так просто, как могло бы быть. Кажется, что нет особого интереса в создании лучших оболочек, хотя мы все так много ими пользуемся.

решение3

Стандартные оболочки в стиле Bourne ( sh, bash, ksh, и т.д.) уже позволяют вам делать следующее:

for repo in repo1 repo2 repo3 ; do git clone $host/$repo ; done

(Обратите внимание на необходимость использования точек с запятой перед doи done.) Кроме того, в bashи других оболочках, если $repoвстречается в команде только один раз, вы можете написать:

git clone $host/{repo1,repo2,repo3}

решение4

Scheme Shell, scsh, действительно хорош.

Как отмечает Кит Томпсон, он бесполезен как интерактивная оболочка (хотя Commander S выглядит как интересный эксперимент). Вместо этого, это отличный язык программирования для контекстов, где наличие всех привязок POSIX полезно — это включает случаи, когда вы хотите вызывать другие приложения unix. Скрипт оболочки из более чем нескольких десятков строк будетвсегдачувствуешь себя хакером, как бы аккуратно ты ни писал sh; напротив, ничто не мешает тебе писать серьезные программы с использованием scsh.

scsh не очень компактен (краткость — одновременно и сила, и слабость языков семейства sh), но он мощный.

Поскольку scsh полезен и практичен для малых и больших задач, он, между прочим, является хорошим способом освоить Scheme (хотя, если это и есть ваша цель, в наши дни вы можете сразу перейти к Racket).

Преимущества функциональных языков проявляются не только в задачах, требующих работы со списками (хотя в силу своей истории они, как правило, отдают предпочтение спискам как структуре данных) — это действительно надежный способ написания программ, если вы выпьете правильного коктейля.

Не существует осмысленного смысла, в котором оболочки в стиле sh являются функциональными, а Python функционален только в том пограничном смысле, что у него есть лямбда-функция.

Связанный контент