LINUX.ORG.RU

Если в баше все так плохо, не пора ли перестать им пользоваться для скриптов?

 ,


5

7

Прочитал на днях вот эту статейку: http://www.dwheeler.com/essays/filenames-in-shell.html. Это просто жесть. Я наверное не видел ни одного баш скрипта, который бы делал все правильно, как там описано. Не легче ли использовать какой-нибудь там питон для этого, а не терпеть внезапные унижения собственным шеллом, когда ты впервые запустишь скрипт на файлах с русскими символами / пробелами / переносами строк / еще какими-нибудь внезапными названиями?

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

В котором 90% левых библиотек до сих пор кладут хер на юникод и твой рюске изык. Используй, чо.

entefeed ☆☆☆
()

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

Не легче.

Впрочем, вообще никто, кроме поттеринга, не запрещает тебе писать какие угодно скрипты на чём угодно, хоть на сях, хоть на пистоне, хоть на хаскеле каком с пхпой.

Stanson ★★★★★
()

Во-первых, bash для скриптов никогда нельзя было пользоваться, пользоваться можно только sh. А так, вся статья сводится к

  • не забывайте --
  • не забывайте кавычки вокруг переменных
  • используйте find -print0 | xargs -0

И нет, питон использовать не легче.

slovazap ★★★★★
()
Ответ на: комментарий от Valdor

Казалось бы, при чём тут Поттеринг?

При том, что он и его холуи аццки хейтят и хотят запретить инитскрипты.

Но хейтеров было не остановить.

Да, очень сложно остановить хейтеров шелл-скриптов. Но, надеюсь, всё получится.

Stanson ★★★★★
()
Ответ на: комментарий от hlebushek
$ python
Python 2.7.9 (default, Dec 12 2014, 06:07:10) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sh
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named sh
>>> 

$ python3
Python 3.4.2 (default, Dec 27 2014, 19:25:25) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sh
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'sh'
>>> 

alozovskoy ★★★★★
()

Если в баше все так плохо
http://www.dwheeler.com/essays/filenames-in-shell.htm

Уж с чем-чем, а с работой с файлами, в том числе с многобайтовой кодировкой в именах, в Баше все хорошо. Статья же разбирает ошибки программиста, ну и немножко проблемы других шеллов (не ГНУ Баша).

Массы говнокода на Баше имеют ту же природу, что в времена не столь давние имели те же массы на PHP — порог вхождения близок к нулю.

не видел ни одного баш скрипта, который бы делал все правильно

А я видел (и даже немного писал :-).

Не легче ли использовать какой-нибудь там питон

Попробуйте — и узнаете. Мне нет.

Zmicier ★★★★★
()

достаточно знать чем отличается

cat *
от
cat ./*
чтоб перестать велосипедить как в той статье. С другой стороны, если баш не желать знать, то откуда взять желание знать питон?

P.S. мне кажется те, кто предлагают заменить шелл - не понимают как его готовить.

Deleted
()
Ответ на: комментарий от hlebushek
alex@host $ pip
bash: pip: команда не найдена

alex@host $ sudo apt-get install python3-pip
Password:
sudo: apt-get: command not found
Deleted
()
Ответ на: комментарий от hlebushek

Лол, ты так и не понял? Я тебе говорю про то, что разные инструменты предназначены для разных задач. И да, я то установить могу, и на subprocess стандартном тоже могу это написать, только зачем? И еще - у тебя не всегда есть возможность пихать на хосты все что тебе захочется (локалхоста это не касается).

alozovskoy ★★★★★
()

Не легче ли использовать какой-нибудь там питон для этого

sh/bash годится максимум как интерактивная среда. Если нужно что-то автоматизировать и хочется чтобы это работало предсказуемо, то да, нужно использовать что-то вроде питона.

mashina ★★★★★
()

Всё верно. Баш не нужен. Ведь уже давно есть zsh

zolden ★★★★★
()

не пора ли перестать им пользоваться для скриптов

Ещё один прозрел, лол.

quantum-troll ★★★★★
()
Ответ на: комментарий от hlebushek

плохой язык, потому что разрешает говнокод

питон тоже плохой язык, потому что разрешает

list(zip_longest(*[iter(('0'+str(bin(int(time.time())))[2:]).replace('0', '_').replace('1', '*'))]*4))

Deleted
()
Ответ на: комментарий от Stanson

не запрещает тебе писать какие угодно скрипты на чём угодно, хоть на сях, хоть на пистоне, хоть на хаскеле каком с пхпой.

Вот он и пишет, на чём хочет. Никто не запрещает Инитскрипты. Просто люди (причём, другие люди) делают рациональный выбор.

Valdor ★★
()
Последнее исправление: Valdor (всего исправлений: 1)
Ответ на: комментарий от Deleted

Но тут то нет ничего плохого. Если нормально скобочки выделить и разбить по строкам, то все ясно.

hlebushek ★★
() автор топика

bash устаревшая концепция «всё есть текст», которая не выдерживает никакой критики. Правильная замена — PowerShell. Надеюсь, с открытием .NET его портируют в юникс и появится нормальное окружение.

Legioner ★★★★★
()
Ответ на: комментарий от hlebushek
if result <= 1:
    print ("Номер подъезда 1")
    x=1
elif result <= 2:
    ...
elif result <= 322:
    ...
else:
    print("Карлсон живет на крыше!!!")

здесь тоже всё ясно, но быдлокодом быть не перестанет, а если язык разрешает такое - то это плохой язык.

Deleted
()
Ответ на: комментарий от ritsufag

и как оно? чем он (только пожалуйста объективно) лучше башмака?

novoxudonoser
()

Баш лучший своих задач. А особенности есть в любом языке.
Кнопки команды «сделать все зашибись» еще не изобрели.
Ну, а тебе никто не мешает писать хоть на питоне, хоть на php - вперед, чё.

Kroz ★★★★★
()
Ответ на: комментарий от te111011010

как нужно - незнаю, я тот еще говнокодер. можно функцией, чтоб не повторять блок 322 раза, проверяя допустимость значений в диапазоне.

Deleted
()
Ответ на: комментарий от erzent

всё плохо, всё нужно выкинуть, потому что любая альтернатива - тоже плохая.

Deleted
()
Ответ на: комментарий от Legioner

Правильная замена — PowerShell

Буэ-э-э-э. Вот уж убожище изначальное. Даже если сесть и хорошенько подумать, как написать самый угрёбищный шелл, то такого говнища всё равно не придумаешь.

Stanson ★★★★★
()

Пора. Поэтому уже есть systemd. При всех его заскоках, выгонять скриптоту чем-то надо.

Deleted
()
Ответ на: комментарий от Legioner

устаревшая концепция «всё есть текст»

Для жабообразного быдла. А щас таких большинство.

anonymous
()
Ответ на: комментарий от erzent

Нет. А что смешного? Очевидно, что в виде недотекста (потому что в юниксе даже текста по сути нет, только поток байтов, по счастливой случайности иногда декодируемый как UTF-8) всё представить возможно, но при работе с этим неизбежна куча проблем.

Есть понятие имя файла. Оно может быть представлено как массив байтов, а может быть представлено как объект класса «Имя в файловой системе».

Как башеры работают с процессами? Запускают ps и долго и мучительно парсят вывод ps-а как поток байтов. Как надо работать с процессами? Вызвать функцию и получить список объектов класса «Процесс» с нужными свойствами и методами.

Это просто другой уровень надёжности и удобства.

Это можно попытаться повторить в других языках, например как Python-овский пример выше, но PowerShell это DSL специально заточенный под эту задачу, который будет заведомо удобней. Хотя и Python это огромный шаг вперёд в сравнение с bash.

Беда юникса в том, что его облюбовали админы, не умеющие в программирование и обкладывающие свой юникс связками костыликов, копящихся с 80-х годов. Любой поттеринг-срач это отлично показывает.

Legioner ★★★★★
()

А мне вот fish нравится как скриптовый язык. Там и дурдом из синтаксиса убрали, и проблем с кавычками нет, т. к. переменные - это переменные, а не макросы. Жаль, что не взлетело.

anonymous
()
Ответ на: комментарий от Legioner

В жопе пальцем ковыряем, Черносливы достаём.

anonymous
()
Ответ на: комментарий от Legioner

Беда юникса в том, что его облюбовали админы, не умеющие в программирование и обкладывающие свой юникс связками костыликов, копящихся с 80-х годов. Любой поттеринг-срач это отлично показывает.

Беда юникса в том, что в него пришли такие как ты, ищущие беды юникса, и пытающиеся их исправлять.

Black_Shadow ★★★★★
()
Ответ на: комментарий от Legioner

Как башеры работают с процессами? Запускают ps и долго и мучительно парсят вывод ps-а как поток байтов

похоже ты не знаешь о существовании /proc

novoxudonoser
()
Ответ на: комментарий от alozovskoy
from subprocess import call
call(['/etc/init.d/service', 'start']) if call(['grep', 'start', 'service_action']) == 0 else print('service must be disabled')

Добавь from __future__ import print_function если у тебя второй питон.

Laz ★★★★★
()

На самом деле, проблема баша в том, что в нем нет типов данных. В нем все обрабатывается и выводится как текст (хорошо, что хоть до байтов не додумались). Если до 90х это был достаточно рациональных подход и решал проблем больше, чем создавал, то сейчас все наоборот, в эпоху динамических виртуальных машин с инъекциями кода, жастинтаймкампиллерами и прочим (да, да, я говорю о PowerShell, вы поняли), это как сравнивать счетные палочки и вольфрам математику.

nikolnik ★★★
()

Статья хорошая, но пальцем в небо. Последний раз, когда я с этим столкнулся был год 2005 или 2006, перенося файлы из fs на koi8-r на utf-8. Больше таких проблем не было: файлы со странными именами, на которых гоняются такие скрипты просто так не появляются. А там, где даётся возможность другим людям писать файлы с кривыми именами и гонять по ним такие скрипты — ССЗБ и пусть страдают. Баш, как и пхп созданы не для школоты. Для школоты есть Basic.

Не умение пользоваться гранатой не говорит о том, что она плохо спроектирована. Это говорит о том, что её пользователь обезьян.

gh0stwizard ★★★★★
()
Ответ на: комментарий от Legioner

Как надо работать с процессами? Вызвать функцию и получить список объектов класса «Процесс» с нужными свойствами и методами.

ООП головного мозга. Мне очень жаль, но по моим наблюдениям, не лечится.

iVS ★★★★★
()
Последнее исправление: iVS (всего исправлений: 1)
Ответ на: комментарий от novoxudonoser

похоже ты не знаешь о существовании /proc

Похоже у тебя мозг зациклен на линуксе, на других системах /proc-а вполне может и не быть. Но даже /proc не решает проблему неструктурированности данных.

Legioner ★★★★★
()

баш это прекрасный клей в котором неосиляторы завсегдатаи по уши

anonymous
()
Ответ на: комментарий от iVS

Да, после нормальных языков при работе с башем порой самопроизвольно блюю радугой :( Это действительно не лечится, к хорошему привыкаешь быстро.

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.