LINUX.ORG.RU

KOSMOS — сборка комфортненьких shell-скриптов, функций и конфигов системы

 , kosmos, , ,


1

1

После около 13 лет разработки создал репозиторий с проектом KOSMOS.

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

Удобный механизм запуска и создания новых скриптов. Просто введя 'C newscript' запускается $EDITOR с готовой шапкой #!/bin/bash в котором прописываешь скрипт, после просто сохранения которого можно в любом терминале запустить этот скрипт просто по названию 'newscript' (он сохранился в директории со скриптами и ему прописался x-bit).

Один из моих любимых и полезных скриптов - pk. Это фронтенд для всех тулзов и утилит пакетного менеджера в CRUX, все в одном. Простой запуск pk <что-то там>, включая всё нужное (установка, обновление, сборка и т.д.). pk i <port> - установить, pk u <port> - обновить, pk b <port> - собрать, и т.п. На данный момент 40 функций.

mig - скрипт для миграции конфигов или любых наборов списков файлов из одной (директориии) системы в другую.

S2R - скрипт для запуска ОС с корнем в tmpfs, можно потом вынуть флешку и пользоваться системой вообще без дисков.

Также там сборка моих конфигов (CRUX GNU/Linux) включая коллекцию портов.

В KOSMOS реализована идея создания корневого конфига (/CONFIG), содержащего основные переменные OS. Можно будет не зависеть от FHS, создавать свою структуру директорий. Кому сдался этот /usr/?

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

# A collection of usefull open-source shell scripts (bash scripts, tools, functions)
# and configuration files.


The scripts use /CONFIG file which contains main system variables:
BOOT, BIN, CFG, DEV, LIB, PROC, RUN, SYS, TMP, VAR, ...
 Variables with directoty names will be used in future for specifying
 main directories of OS.
 It will not be limited by FHS, not depent on it.
 No need of /usr/. Create own set of tree(s).
kernel, libc, init, system_profile, bootloader, system_ISA, system_CPU, default_SHELL, ...


The scripts:


si  - (system install) source-based package manager (set of tools)
for UNIX-like systems
with automatic 100% correct dependencies resolving.
 Ports system like in CRUX, Gentoo, FreeBSD, NetBSD, OpenBSD.
 Optional cross-architecture toolchain building, which allows 
creating new UNIX-like Operating Systems
(distributions of custom kernels and selected environments,
idealy, ability to choose an open-source kernel
(FreeBSD, Haiku, HURD, L4, Linux, NetBSD, OpenBSD, Plan9 and , ...),
choose from varios libc's,
and choose environments: GNU, or not GNU, *BSD, Plan9 and , ...).
Can create entier new distribution in a directory with one command.
 All the process of building of each package is user customized with set of options.
All configure options of building for each port are listed in special configuration
files and scripts (recipes) of each port.
 Absolutely correct dependency resolving is based on 5 special curtain
CONF*, BUILD*DEPS* and RUN*DEPS* files (arrays ?) of eatch port.
'CONF*' -- list of all configure options.
'BUILD_DEPS*' -- list of all build dependencies.
'RUN_DEPS*' -- list of all run dependencies.
'BUILD_CONF_DEPS*' associative array with list of all configure options that require build dependencies.
'RUN_CONF_DEPS*' associative array with list of all configure options that require run dependencies.
This means that all configure options are connected to curtain dependencies. Also if you add/remove an configure option, it will pick up all required deps.
 There is "$PM_db/FLAGS/$system_ISA/$system_CPU/FLAGS" file (and 'CREATE_FLAGS' script for generating the file,
and 'ED_FLAGS' for editing the file) which contains all CPU-specified 'make' variables 
(ASFLAGS, CPPFLAGS, CFLAGS, CXXFLAGS, LDFLAGS, LDLIBS, MAKEFLAGS, ..., all of them).
 Lists of recipes (files with recipes for proceeding).
 Varios profile sets of recipes (desktop, server, router, ... create any).
 Logging!
 Sandbox for build and installation process. Tool for modifying all proceeded built packages on set of rules.
 Posibility of installing selected ports into any new or existing prefix.
There will be core in / and availability to add or remove ports to 'core'
or to any available prefix. Like prefix in 'Gobo Linux', but name and combination
of prefixes will be user specified.
For example, user can place a whole toolchain (or any set of ports) in a separate directory.
 Existence of CONF file that specifies all build options for each port gives an ability to
add in future optionall USE_FLAG system (like in 'Gentoo') for any set of ports.
Even MULTI-FLAGS.
Spectre of available/used use-flags will be user specified.
 User controlls the process of building every port with recipes and configuration files,
which give an ability to control every configure option of build process of each port.
User can be a maintainer of his own system.
 User has full control over the operating system.
#### 'si' is not yet completed. I use 'pk' on my CRUX system.


pk - script for package management in CRUX OS with prompt waiting for confirmation,
showing in color which packages will be updated, installed or removed.
It uses a simple syntax, like:
'pk i package1 ...' -- for installing package(s) with all dependencies,
'pk u pakage1 package2' -- for updating packages, or just
'pk u' -- for updating all available.
 It implements many PM features (build (b), download (do), install, install with deps (i), update,
update with new deps (u), update prt-get cache (c), search (s), search in description (sd),
show missing deps (m), show deps (de), show packages that depend on (depson),
check signature (cs), update signature (us), and other).
 It is like a custom front-end for pkgutils, prt-get, prt-utils, pkg-backup, ... .
 'pk' is my (temporary) pakage manager, it is an attemp to make package management
in my favourite and one of the bests disto, CRUX, more nice, until 'si' and my
recipes (ports) collection will be completed.
'si' will be able to do all that 'pk' can and beyond.
Probably, 'pk' will be a symlink to 'si', or even 'si' will be renamed to 'pk'.


chain - creates a toolchain with a single command (amd64 only for now), based on LFS Book.
It also installs CRUX PM, which allows building CRUX from scratch.


S2R  - (System to RAM) move / to tmpfs and make operating system to work completely from RAM
without need of any attached disks or flash-drives.


C  - create/modify scripts. For example 
'C myscript' will create 'myscript' with an "$EDITOR" in "$KOSMOS_scripts/" directory,
after saving the file, you can run it immidiately just typing 'myscript' in any terminal.


ch  - chroot with automatic mounting.


d  - better cd.


GET_OPTS / GET_ARGS  - get options (starting with '-' or '+') / non-options from "$@".
Extended options with an argument like '-d1' or '-d 1' may be defined by EOPTS='-d'.
For extended options, argument of which may not start with '-' (optional positive argument),
use $PEOPTS.
If there is an option like '-and' (single option, but not starting with --),
SOPTS='-and' shoud be used.
$EOPTS, $PEOPTS, $SOPTS are space separated lists, like EOPTS='-d -f -N'.
If you want to catch options starting with '+', use plus_options=1.
 In script running 'GET_ARGS "$@"; GET_OPTS "$@"' will create arrays 'ARGS' and 'OPTS',
containing all arguments.
# Should create 'GET_ARGUMENTS' function, which will create some kind of an associative array 'ARGUMENTS' with all arguments and options in one.


g  - 'grep -IP[r]' - automatic '-r' when needed. And similar links (gi, gv, gc, gL, gl, giL, gil, ...)
for specific keys.


U  - unplug device.
Sync FS-cache, disable swaps, recursive unmount, flush HW-cache on block device.
For example 'U sdb' will unplug "$DEV/sdb" device.


u  - recursive unmount.


x  - extract an archive. For example 'x KOSMOS.txz' or 'x files.xz'.


T  - create tar archive. For example 'T archive.txz files/'.


gin  - install GRUB2 and automaticaly modify PARTUUID in 'fstab' and 'grub.cfg'.


mig - migrate (configuration) files from one system (dir) to another.
For example 'mig / /new_system/' will copy set of (config) files to '/new_system/'.
A key '-l' sets a set of rules for migration, for example '-l config'; you can
create own set of actions.


s  - sync SW & HW disks caches.


b / bb  - show processes.


And more than hundred other scripts and functions...

ССЫЛКА НА ХРАНИЛИЩЕ КОДА

Перемещено CrX из opensource

★★★★★

Последнее исправление: teod0r (всего исправлений: 9)
Ответ на: комментарий от another

Статья подразумевают некую законченость, значимость, структуру и обработку формы. Личный дневничок — ни разу, даже если его кому-то показываешь. Другой уровень ответственности.

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

Статья подразумевают некую законченость, значимость, структуру и обработку формы.

Эй, стопэ. Мы не на первом канале. Это всего-лишь ЛОР, здесь можно и нужно быть проще. И да, топик вполне подходит под твое описание. ИМХО :)

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

Почему не тред? Там есть обсуждение. Это, по сути, технический блог, в котором предполагаются интересные вещи по поводу онтопика.

Потому что каждая статья — отдельный тред.

Есть общее описание идеи, есть краткое описание некоторых скриптов, есть ссылка на них, есть обсуждение. Что не так?

Зачастую попросту не стоит того. Нечего там расписывать порой.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)

Можешь рассказать, зачем в коде у тебя везде по 2-5 пустых строк? https://git.org.ru/kosmos/KOSMOS/src/branch/main/S/C

Ты когда-нибудь дважды заглядывал в эту писанину?

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

зачем в коде у тебя везде по 2-5 пустых строк?

по 5 нету. 2 разделяют условия, циклы (всякие if, for), 1 разделяет назначение переменных, процессы в фоне. 3 разделяют назначение функций (4 кое-где осталось по-старинке, не везде поменял на 3).
так визуально удобнее.

Ты когда-нибудь дважды заглядывал в эту писанину?

сотни раз заглядывал.

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r
  1. Так а что это за ганстастайл с пустыми строками?

  2. Если отделить функции для твоего слакварь и убрать всратые алиасы типа ak aw функционально бесполезные, то там полезного будет 10 функций

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

по 5 нету. 2 разделяют условия, циклы (всякие if, for), 1 разделяет назначение переменных, процессы в фоне. 3 разделяют назначение функций (4 кое-где осталось по-старинке, не везде поменял на 3). так визуально удобнее.

Вангую, что это codestyle sh или какого-то csh. И ты в баш этот всратый стиль тащишь. Более того, ты используешь эти всратые условия [] &&, вместо того, чтобы оформить это в нормальные баш исловия иначинаешь разделять пустыми строками логические блоки и проверки визуально отделять.

Кулхацкер 146lvl

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

Потому что шелл следует использовать как шелл. Тогда удобно будет. Ну, может и не удобно, но наименее неудобно.

Конструкции вида do-something && echo ok || echo fail позволяют использовать преимущества шелла: краткую, читаемую форму записи, для манипуляции процессами. Попытка же с помощью if писать как в нормальном языке программирования, приведёт к тому, что преимущества баша растеряются, а всё равно нормально не выйдет. Лучше уж сразу на настоящем языке и писать.

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

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

Да как-то в нормальном стиле весь обвес и такого не ощущаю

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

Японамать… Жесть какя-то :)
Для тех, кто в танке:


			numerate() {

				local c line


				while IFS= read -r line; do

					(( c++ ))

					printf "$c:%s\n" "$line"
				done


			}




		}




		C_command() { eval cat '"$file"' $hide_empty $numerate_lines $use_pager; }




	;;

	*)




		C_command() {


			[[ "$file" =~ .+/ ]] &&{

				dir="$BASH_REMATCH"


				[[ -e "$dir" ]] || mkdir -p -- "$dir" || continue 1


			}


			[[ -e "$file" ]] ||
				printf '%s\n\n' "#!${BIN%%/}/$default_SHELL" >"$file"


			_scripts=$(Ext=1 esc_regex "${KOSMOS_scripts%%/}")


			grep -Eqm1 "^$_scripts/($ignore_files)$" <<<"$file" ||
				chmod -- "$chmod" "$file"


			"${EDITOR[@]}" "$file"
		}

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

Ну так я ж об том же. Кто тут скажет, что вот так хуже, чем у него?

function numerate () {
    local c line

    while IFS= read -r line; do
	(( c++ ))
	printf "$c:%s\n" "$line"
    done
}

}

function C_command() {
     eval cat '"$file"' $hide_empty $numerate_lines $use_pager;
}

;;
*)

function C_command () {
	 if [[ "$file" =~ .+/ ]] && {
	        dir="$BASH_REMATCH"
	        [[ -e "$dir" ]] || mkdir -p -- "$dir" || continue 1
	    }

	 [[ -e "$file" ]] || printf '%s\n\n' "#!${BIN%%/}/$default_SHELL" >"$file"
	 _scripts=$(Ext=1 esc_regex "${KOSMOS_scripts%%/}")
	 grep -Eqm1 "^$_scripts/($ignore_files)$" <<<"$file" || chmod -- "$chmod" "$file"
	 "${EDITOR[@]}" "$file"
     }
     ..
 }
bryak ★★★★
()
Ответ на: комментарий от Zhbert

Для того, чтобы в код посмотреть - сначала надо весь этот кулхацкерский codestyle убрать. Заморозьте его на неделю - он быстро рефакторинг сделает :)

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

надо весь этот кулхацкерский codestyle убрать.

делается одной командой.

рефакторинг сделает :)

зачем? или есть способ сделать отступы по определённым условиям в текстовом редакторе? например nano? IDE?

teod0r ★★★★★
() автор топика
Ответ на: комментарий от bryak

Жесть какая-то. Как читать этот if без then, но с &&, то ли в условии, то ли хз где, я не распарсил. Что за жесть с оторванными от всего ;; и *) перед этим — тоже.

Да, из-за кучи пустых строк код ТС читать тяжко — кажется, будто форматирование поехало где-то. Но он по крайней мере понятен, когда смиришься с этим. Твой же совсем запутывает.

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

Что за жесть с оторванными от всего ;; и *)

;; чтоб визуально заметнее было
*) потому что бывает очень много уровней вложений, если до этого есть ещё несколько if, for, и код сильно съезжает вправо.

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

Вообще мой вопрос про ;; *) был не к тебе. Но я понял, что это из середины вырванный фрагмент, и там case. Но тогда получается, что у @bryak тело того, что происходит в условиях case, без отступа, что тоже путает.

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

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

Тупо как-нибудь вот так уже проще воспринимать:

#!/bin/env bash

chmod=0755
ignire_files='DESCRIPTION|functions/.*|PM/(DISK|GET_PKG_DEPS|LFS_/env|CONFIG)|TODO'

trap9

GET_ARGS "$@"
GET_OPTS "$@"

[[ -t 2 ]] && noCOL2="$noCOL" RED2="$RED"

declare -i c
unset Ext

_0="${0##*/}"

case "$_0" in
    A|CA)
        for (( c=0; c<${#OPTS[*]}; c++ )); do
            case "${OPTS[c]}" in
                -n) numerate_lines='| numerate';;
                -p) hide_empty='| sed /^$/d'
            esac
        done

        [[ "$_0" == A ]] && use_pager="| $PAGER"

        ea "${numerate_lines[@]}" ||{
            numerate() {
                local c line
                while IFS= read -r line; do
                    (( c++ ))
                    printf "$c:%s\n" "$line"
                done
            }
        }

        C_command() { eval cat '"$file"' $hide_empty $numerate_lines $use_pager; }
    ;;

    *)
        C_command() {
            [[ "$file" =~ .+/ ]] && {
                dir="$BASH_REMATCH"
                [[ -e "$dir" ]] || mkdir -p -- "$dir" || continue 1
            }

            [[ -e "$file" ]] \
                || printf '%s\n\n' "#!${BIN%%/}/$default_SHELL" >"$file"

            _scripts=$(Ext=1 esc_regex "${KOSMOS_scripts%%/}")

            grep -Eqm1 "^$_scripts/($ignore_files)$" <<<"$file" \
                || chmod -- "$chmod" "$file"

            "${EDITOR[@]}" "$file"
        }
esac

for (( c=0; c<${#ARGS[*]}; c++ )); do
    file="${ARGS[c]}"

    [[ "$file" == */ ]] && {
        printf "\n\t$RED2%s$noCOL2\n" "Wrong filename \"$(esc "$file")\"." >&2
        continue 1
    }

    if [[ "$file" == /* || "$file" == ./* ]]; then
        file=$(realpath -m "$file")
        C_command
    else
        cd -- "$KOSMOS_scripts" || exit
        _file=$(esc_regex "$file")
        find=$(find -L -O3 \( -type f -o -type l \) -a \( -name "$_file" -o -wholename "./$_file$" \) 2>"$DEV/null")

        [[ "$find" ]] \
            && file=$(sort --parallel="${JOBS:-1}" -V <<<"$find" | tail -1)

        file=$(realpath -m -- "$file")
        C_command
    fi
done
CrX ★★★★★
()
Ответ на: комментарий от teod0r

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

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

то происходит в условиях case, без отступа, что тоже путает.

Да я просто убрал все эти бестолковые 2-4 пустые строки и проставил function. Понятно, что у логических блоков - 1 пробел, между блоками - 2 пробела

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

Да я просто убрал все эти бестолковые 2-4 пустые строки и проставил function.

Не только. Вот этой дичи у ТС нет:

	 if [[ "$file" =~ .+/ ]] && {
	        dir="$BASH_REMATCH"
	        [[ -e "$dir" ]] || mkdir -p -- "$dir" || continue 1
	    }

К ней у меня и был основной вопрос.

Тут уж или так:

            [[ "$file" =~ .+/ ]] && {
	        dir="$BASH_REMATCH"
	        [[ -e "$dir" ]] || mkdir -p -- "$dir" || continue 1
	    }

Или так:

            if [[ "$file" =~ .+/ ]]; then
	        dir="$BASH_REMATCH"
	        [[ -e "$dir" ]] || mkdir -p -- "$dir" || continue 1
	    fi

А твой вариант — это какой-то монстр Франкенштейна.

Мне, кстати, первый больше нравится. if без else в шелле не нужен.

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

делается одной командой.

Прогони через форматер баша

А так-то этот ганстастайл 146% взят из CRUX’a. Смысл в таком стиле нулевой. Из-за этого скрипт в 30 строк разливается на 130 строк. К тому же ты бы перепроверил всё своё барахлишко. А то там куча всего, что не имеет смысла. awk –> ak aw. И там такого навскидку несколько штук

Выкладывая это, ты же в первую очередь хотел получить обратную связь по наработкам? Ну вот тебе и обратная связь

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

Вот этот стиль - это кулхацкерский стиль

[[ "$file" =~ .+/ ]] && {
    dir="$BASH_REMATCH"
    [[ -e "$dir" ]] || mkdir -p -- "$dir" || continue 1
}

Визуально это:

if [[ "$file" =~ .+/ ]]; then
    dir="$BASH_REMATCH"
    
    if [[ -e "$dir" ]]; then
        mkdir -p -- "$dir" 
    else
        continue 1
    fi
fi

выглядит лучше, чем вот это:

if [[ "$file" =~ .+/ ]]; then
    dir="$BASH_REMATCH"
    [[ -e "$dir" ]] || mkdir -p -- "$dir" || continue 1
fi

Потому что надо всматриваться, к чему относится ||. Оно является дополнительным условием ‘или’ или является заменителем else

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

Я категорически не согласен, что первое выглядит лучше, но спорить смысла не вижу. Вкусовщина это.

Мой комментарий был о том, что у тебя в примере и не то и не другое, а некорректный бред — if без then и fi.

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

Мой комментарий был о том, что у тебя в примере и не то и не другое, а некорректный бред — if без then и fi.

Ну да, я там поставил if и понял, что всю эту синтаксическую конструкцию надо разбирать, чтобы понять, как правильно все эти if else fi выставить. Плюнул и пошел чай пить. Это занятие полезней, чем разбирать всё эти CRUX-based конструкции

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

Не успел исправить предыдущее:

P.S. Хотя нет, смысл спорить вижу. Тут логика разная. В оригинале варианте continue вызывается, если mkdir завершился с ошибкой, в твоём — нет.

P.P.S. И вообще всё наоборот — у тебя mkdir вызывается, если каталог уже существует. А надо ровно наоборот. Этим первый вариант и лучше — сразу всё видно и не возникает таких вот ошибок нелепых. Спасибо за наглядную демонстрацию :)

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

Тут логика разная. В оригинале варианте continue вызывается, если mkdir завершился с ошибкой, в твоём — нет.

No problemA:

if [[ "$file" =~ .+/ ]]; then
    dir="$BASH_REMATCH"
    
    if [[ -e "$dir" ]]; then
        mkdir -p -- "$dir" || continue 1
    fi
fi

Зачем мне вникать в логику работы этого куска кода? Я синтаксически вижу фигню. Что это неподдерживаемый стиль написания. Через месяц он сам заходит в это и пол часа вникает «что оно там делает?». Я это говорю из-за того, что весь свой обвес ~10k строк раза три рефакторил. На третий раз приходит понимание, что так, как в KOSMOS писать можно и оно работает. Но переписывать это рано или поздно надо будет

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

Всё ровно наоборот. Там сразу всё видно, а в твоём варианте ты ОПЯТЬ повторил ту же ошибку и создаёшь существующий каталог (а несущшествующий не создаёшь) — то есть, код не имеет смысла вообще, его можно полностью удалить.

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

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

Да ёлы-палы. Ну пусть оно так работает в оригинале. Зачем мне это нужно? Я указал на синтаксис. Зачем мне знать как оно там правильно работает?

if [[ ! -e "$dir" ]]; then
    mkdir -p -- "$dir" || continue 1
fi

или так:

if [[ ! -e "$dir" ]]; then
    mkdir -p -- "$dir" 
else
    continue 1
fi

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

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

Ну вот теперь, с четвёртого раза, правильно.

ТС такой ошибки не совершил, и с простым синтаксисом её совершить в принципе сложно, потому что сразу всё наглядно видно.

То есть, ты сейчас всеми вот этими экзерцизами показал, чем твой подход хуже — сложнее заметить ошибку. Большое спасибо за наглядную демонстрацию, убедил. Ровно в противоположном тому, в чём хотел, правда. Но я и правда стал на это чуть иначе смотреть. Казалось, совсем вкусовщина, но нет, всё же есть разница — было лучше. :)


upd:

который знают все

Нет. Если человек не знает простых и натуральных для шелла конструкций, то и этот сахар, вероятно, не знает. Первые нужнее.

и визуально его легче читать

Точно нет. И ты это наглядно продемонстрировал на своём примере.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от bryak
if [[ ! -e "$dir" ]]; then
    mkdir -p -- "$dir" 
else
    continue 1
fi

Ты решил поучаствовать в соревновании «как написать путаннее и сложнее по максимуму»?

Конкретно этот код (если бы нужно было такое поведение) нормально пишется так:

[[ -e "$dir" ]] || continue 1
mkdir -p -- "$dir"

Ну или если в детстве || покусал, то так

if [[ -e "$dir" ]]; then
    continue 1
fi

mkdir -p -- "$dir"
CrX ★★★★★
()
Ответ на: комментарий от CrX

Точно нет. И ты это наглядно продемонстрировал на своём примере.

  1. я пятый раз говорю, что я не вникал в работу скрипта
  2. если бы ганстастайл баша был визуально лучше if elif else fi, то в других языках эту конструкцию не использовали бы. Почему она в баше до сих пор присутствует? Обратная совместимость с каким-нибудь sh и всякими шелами bsd
  3. если конкретно тебе это удобней - используй, но не утверждай, что это эффективней
bryak ★★★★
()
Последнее исправление: bryak (всего исправлений: 2)
Ответ на: комментарий от CrX

Или просто так:

mkdir -p -- "$dir"

Потому что ты его в любом случае должен создать. И все проверки не нужны т.к эту проверку реализует сам mkdir

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

я пятый раз говорю, что я не вникал в работу скрипта

Я тоже. Только в тот фрагмент, который мы обсуждали. Но ты в четырёх строках умудрился всё сломать.

И нет, я не хочу тебя унизить и сказать, что ты ничего не умеешь. Наоборот. Это просто наглядная демонстрация, к чему приводит избыток сахара там, где он нафиг не нужен.

если бы ганстастайл баша был визуально лучше if elif else fi, то в других языках эту конструкцию не использовали бы.

Он не всегда лучше. Но часто. В данном случае все эти ifы — это какие-то ненужные понты. Но в коде со сложной логикой, особенно с else и особенно ещё и с elifами, и/или где в каждой ветке куча кода, они полезны.

Но другие языки при этом иррелевантны. Мы сейчас о шелл-скриптах.

Почему она в баше до сих пор присутствует?

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

Хотя в баше в принципе много чего присуствует… В том числе просто по историческим причинам. Это не самый лучший пример дизайна.

если конкретно тебе это удобней - используй, но не утверждай, что это эффективней

Так я и не начинал. Ты ворвался и стал утверждать, что вариант с кучей if’ов лучше. А потом наглядно сам же продемонстрировал его проблемы.

Так что я изначально согласен «не утверждать». Если ты в свою очередь больше не утверждаешь, что твой вариант лучше :)

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

Или просто так:

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

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

То, что я не правильно повторил логику работы оригинального скрипта не отменяет этого KOSMOS -- сборка комфортненьких shell-скриптов, функций и конфигов системы (комментарий)

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

Но другие языки при этом иррелевантны. Мы сейчас о шелл-скриптах.

Вот поэтому везде шелл-скрипты и выбрасывают и говорят о них так: если вам нужно что-то по-сложней hello world, то возьмите нормальный ЯП. Я же пытаюсь использовать shell-скрипты так, чтобы их можно было эксплуатировать и не использовать какой-нибудь пайтон там, где можно обойтись без него

bryak ★★★★
()
Последнее исправление: bryak (всего исправлений: 2)
Ответ на: комментарий от CrX

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

Но мы это, конечно же, проверять не будем :)

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

Ну так-то я в целом согласен с этим посылом. Если скрипт достаточно сложный, лучше взять нормальный ЯП, а не упарываться шеллом. Шелл это в первую очередь клей для вызова сторонних программ + простая логика вроде завершения с ошибкой, или успешно, пайпов, ну и подобного. Сложную логику на нём писать не очень.

Но тут, как всегда в таких «философских» вопросах всё в итоге сводится к тому, где кончается простое и начинается сложное. Эту грань каждый нащупывает для себя сам опытным путём. Как-то формализовать её, наверное, невозможно. Точнее, формализовать-то каждый второй, кто уже нащупал, сможет, но его критерии не совпадут с критериями других в итоге :)

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

Но мы это, конечно же, проверять не будем :)

Ага :)

Там вообще специфичный стиль кода очень. Этот continue вызывается вне цикла… Но в теле функции… которая вызывается в цикле… и при этом ещё и сама функция определена по-разному в зависимости от условия в case… спасибо хоть не в другом файле, а то я бы начал думать, что там где-то в конце игла, а в ней — смерть кощеева.

О таком я и говорил выше — что именно сама логика в этом «космосе» какая-то переусложнённая, и непонятно зачем так писать (а местами вообще можно было вместо нескольких дюжин строк кода тупо одним алиасом обойтись).

P.S. Конкретно в данном случае под «стилем кода» я имею в виду не оформление/форматирование/сахар.

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

всё в итоге сводится к тому, где кончается простое и начинается сложное

Да-да, один считает сложным и пишет 100 строк на python’e, а другой 20к строк на баше пишет и считает это простым и неделями пытается обойти ограничения баша, в итоге всё переусложняет

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

О таком я и говорил выше — что именно сама логика в этом «космосе» какая-то переусложнённая, и непонятно зачем так писать (а местами вообще можно было вместо нескольких дюжин строк кода тупо одним алиасом обойтись).

Так и я об том же. Зачем вникать в эту писанину? :). Смысл в этом какой?

bryak ★★★★
()