Unix эквивалент PowerShell?

21

Мне всегда было неловко, когда сложные команды оболочки включают анализ текста с AWK . По сути, мы конвертируем структурированные данные в текст, затем снова анализируем текст, чтобы вернуться к структурированным данным.

PowerShell - это оболочка Windows, которая позволяет избежать этой проблемы, позволяя вам передавать типизированные объекты между командами оболочки, а не просто текстом.

Существуют ли какие-либо оболочки Unix, основанные на объектах, а не на тексте, такие как PowerShell?

Вим Коенен
источник

Ответы:

24

Нет, все наоборот. Там нет ложки ^ H ^ H ^ Структурированные данные. Есть только текст.

Большая часть философии Unix основана на идее вывода текста и принятия текста в качестве ввода. Возможно, вы захотите прочитать « Искусство программирования Unix », в котором есть хорошее объяснение этого.

Не поймите меня неправильно: я понимаю вашу точку зрения и знаю, к чему вы стремитесь. Есть такие вещи, как интерактивные интерпретаторы Ruby и Python, которые можно использовать в качестве оболочки, но они не так дружелюбны для базовых задач, как Bash. Попробуйте изменить каталог, например.

Кроме того, использование объектов в оболочке - это еще не все. Если бы только ваша оболочка поддерживала это, в Unix вы были бы в недоумении. Все стандартные инструменты для работы с текстом в Unix должны быть изменены, такие как grep, awk, sed и т. Д.

Я думаю, что была попытка создать что-то подобное несколько лет назад, но я не могу вспомнить название и давно не слышал об этом. Это, вероятно, не собирается снимать.

wzzrd
источник
2
Интересно, что замена текстовых потоков (или фактически байтовых потоков) на потоки объектов данных не будет противоречить общим принципам, сформулированным в книге. Кажется, даже лучше играть с «правилом представительства». Просто Unix выбрал текстовые потоки в качестве интерфейса между программами.
Вим Коенен
1
Но под «объектом данных» вы подразумеваете реальный объект Python / Ruby / C ++ или что-то вроде структуры C?
wzzrd
3
+1 «Не пытайтесь согнуть ложку, это невозможно. Вместо этого только попытайтесь осознать правду ... ложки нет». Это не столько текст как интерфейс, сколько потоки данных как интерфейс. Объекты хороши для программирования, но иногда они превращаются в маленькую крошечную тюрьму, в которую можно погрузиться ...
Avery Payne
2
зш> баш. Мое мнение, но на самом деле, если вы еще не пробовали zsh, вам следует
xenoterracide
2
@WimCoenen, доставка вокруг "структурированных данных" означает, что все и тетя Тилли должны договориться, что такое "структура". Даже такие вещи, как ls(1). Совершенно бесполезно.
vonbrand
10

На самом деле есть проект под названием Pash, который нацелен на реализацию PowerShell (поверх Mono), но, похоже, он застопорился.

Марк Пробст
источник
2
Хакеры Unix тратят время на проекты на базе Microsoft = это снова муравей и кузнечик
ixtmixilix
4
Мы вернулись из мертвых: github.com/JayBazuzi/Pash , twitter.com/PashProject
Джей Базузи
4

Есть проект, цель которого сходство с PowerShell: Hotwire . Он сочетает в себе обычный sh с Python-скриптингом и оконным / графическим окружением. Вы могли бы взглянуть на это.

Он основан на объектно-ориентированном конвейере, который вы можете расширять своими собственными объектами, оборачивая существующие программы или используя библиотеки Python.

Elmarco
источник
1
Это проект, который я пытался запомнить название! Последний коммит в сундуке: два года назад ...
wzzrd
4

PowerShell стал открытым исходным кодом в 2016 году. С тех пор он становится все более мультиплатформенным. Исходный код доступен на GitHub, как и установочные пакеты для ряда UNIX-подобных систем.

Tomasz
источник
1

Я думаю, что вы могли бы сделать большую часть этого, написав несколько интерпретируемых (или скомпилированных) скриптов, затем вызывая их в оболочке интерпретатора, которая будет возвращать или сохранять ваши объекты и так далее, если вы захотите.

Вы можете сделать это как минимум на Ruby, Perl, Python, Haskell (например, GHCi), JavaScript (например, node.js), Matlab и, конечно, других языках ...

Кевин Канту
источник
Труба, являющаяся объектами, означает, что вы можете выполнять ленивую оценку и т. Д. Поэтому, если вы передаете набор файловых объектов по трубе ... возможно, вас волнует имя или дата изменения, но, возможно, содержимое. Какие данные вы передаете в JSON? Ответ: это зависит. Если потребитель канала получает данные, он может запросить правильные данные. Проблема решена.
Найджел Торн
1

Спустя три года появилась еще одна мысль: можно представить объект с помощью текстового потока, используя XML или JSON. Я предпочитаю JSON (более простой), и, действительно, существуют проекты, обеспечивающие поддержку классических * NIX утилит JSON. Например: https://github.com/step-/JSON.awk

Одна из проблем использования модели объектного типа для классических * NIX-программ, таких как AWK, заключается в том, что они действительно не поддерживают ОО. Например, хотя в AWK есть ассоциативные массивы, массивы не являются многомерными (каждый элемент в массиве AWK должен быть числом или строкой; массив не может быть объектом массива в AWK).

samiam
источник
Clojure предлагает edn, который позволяет сериализовать / десериализовать все виды типизированных данных, в то время как JSON ограничен.
Марио