Новости:

Форуму исполнилось 12 лет!

Мы в матрице .
Мы в телеге .

Главное меню

Bash - разборки

Автор dZ0TFR, 07 декабря 2020, 12:49:42

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Graf

Или я не понял, или одно из двух. :)

Передано двойное тире (--) которые сообщили скрипту о том, что ключи (опции) кончились и начались параметры.
т.е. работает всё как надо.


dZ0TFR

Почему for $@ in не перебирает начиная с -a - b -c , а начинает с тех опций, где оборвался цикл while ? Не знаю как еще обьяснить проще...

bormant

Потому что shift
while ...
do
    case "$1" in
    ...
    --) shift; break;;
    esac
    shift
done

Второму циклу достанется только то, что после "--"

dZ0TFR

#18
 Спасибо, с этим - всё.

bormant

На всякий случай: shift -- встроенная команда bash. Подробнее
help shift
или
man bash + поиск по ^\s+shift

dZ0TFR

В теории у учебника не спросишь нюансы. Поэтому благодарочка.

dZ0TFR

Еще не все. На подходе sed и awk, плюс регулярки.

dZ0TFR

Чтобы создавать произвольные окна с помощью ncurses мне нужно знать с++ ? Другого способа нет? Есть ли готовые шаблоны ncurses, которые можно было бы видоизменять без знаний c++ ? Стандартных виджетов dialog недостаточно.

Graf

Цитата: dZ0TFR от 19 января 2021, 06:59:17
Чтобы создавать произвольные окна с помощью ncurses мне нужно знать с++ ? Другого способа нет? Есть ли готовые шаблоны ncurses, которые можно было бы видоизменять без знаний c++ ? Стандартных виджетов dialog недостаточно.

Можно использовать bashsimplecurses, там с окнами можно творить всё, что душе угодно  :biggrin_mini:
# git clone https://github.com/metal3d/bashsimplecurses.git

в ./examples есть примеры, в ./docs, документация.
Можно собрать слаковский пакет или просто бросить simple_curses.sh куда-нибудь в PATH.  ;)

FreeArcher

Что значит строка
3>&1 1>&2 2>&3 3>&-
в


user_input=$(\
  dialog --title "Create Directory" \
         --inputbox "Enter the directory name:" 8 40 \
  3>&1 1>&2 2>&3 3>&- \
)


Я нашел описание, но до конца не могу понять

ЦитироватьIn short: 3>&1 opens a new file descriptor which points to stdout, 1>&2 redirects stdout to stderr, 2>&3 points stderr to stdout and 3>&- deletes the files descriptor 3 after the command has been executed.

stdout в файл - это понятно
1>&2 redirects stdout to stderr - это зачем, уже не понимаю?
2>&3 points stderr to stdout  - тут ошибки в файл отправляются?


Graf

Цитата: FreeArcher от 29 марта 2021, 16:00:43stdout в файл - это понятно
1>&2 redirects stdout to stderr - это зачем, уже не понимаю?
2>&3 points stderr to stdout  - тут ошибки в файл отправляются?

Работа идёт не с файлами, а с дескрипторами.
Дескрипторы от 0 до 9 присвоены коммуникационным потокам:

ЦитироватьПоток 0 («STDIN»):
«Стандартный ввод», поток ввода по умолчанию для чтения данных с клавиатуры.

Поток 1 («STDOUT»):
«Стандартный вывод», поток вывода по умолчанию, используемый для отображения обычного текста в терминале.

Поток 2 («STDERR»): «Стандартная ошибка», выходной поток по умолчанию, используемый для отображения ошибок или другого текста для специальных целей в терминале.

Потоки 3-9:
дополнительные, свободно используемые потоки. Они не используются по умолчанию и не существуют, пока что-то не попытается их использовать.


3>&1
Создается поток 3 и перенаправляется в поток 1(STDOUT), что означает, что все, что мы отправим в поток 3 позже, будет отображаться в нашем терминале, как если бы оно было нормально напечатано в STDOUT.

1>&2
Перенаправляется поток 1(STDOUT) в поток 2(STDERR). По сути, промежуточное звено для следующего шага, что бы не потерять данные.

2>&3
Перенаправить поток 2(STDERR) в поток 3. Т.е., если программа что-то напечатает в поток 1(STDOUT), это будет напечатано в потоке 2(STDERR) и наоборот.

3>&-
Закрыть (уничтожить) поток 3 (дескриптор 3).

Т.е. мы получили некую "переключалку" между STDOUT и STDERR.


FreeArcher

Цитата: FreeArcher от 29 марта 2021, 16:00:431>&2
Перенаправляется поток 1(STDOUT) в поток 2(STDERR). По сути, промежуточное звено для следующего шага, что бы не потерять данные.

Спасибо за подробное разъяснение, но вот этот пункт мне так и не понятен.

STDOUT у нас тут пуст.
Мы по какому направлению передаем информацию из 1>2 ведь?

dialog выдает информацию, как я почитал в STDERR. Получается мы STDOUT ( отправляем ) STDERR, не понимаю  :sorry_mini:

bormant

В терминах присваивания номеров потоков в каком-нибудь условном языке программирования могло быть так:

// stdout==1, stderr==2
tmp=stdout
stdout=stderr
stderr=tmp
unset tmp
// stdout==2, stderr=1

FreeArcher

Супер!
Все понятно теперь.

А почему знак ">" как бы в обратную сторону срабатывает?
т.е. получается:
a>b
на самом деле
b=a

bormant

Цитата: FreeArcher от 30 марта 2021, 17:25:35почему знак ">" как бы в обратную сторону срабатывает?
Потому как оператор присваивания изначально перевернут: "куда=что" вместо "что->куда".