программирование сценариев bash

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Программирование сценариев bash

Непрочитанное сообщение Olej » 15 фев 2019, 13:02

Столкнулся с неожиданностью... :-o

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/MachineLearning/digits$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux buster/sid
Release:	testing
Codename:	buster
Обнаружил ... для себя неожиданную вещь:

Код: Выделить всё

olej@ACER:~$ ls -l `which sh`
lrwxrwxrwx 1 root root 4 янв 17 21:08 /usr/bin/sh -> dash

Код: Выделить всё

olej@ACER:~$ ls -l /usr/bin/*ash* | egrep [a...z]*ash
-rwxr-xr-x 1 root root 1168776 янв 24 12:01 /usr/bin/bash
-rwxr-xr-x 1 root root    6793 янв 24 12:01 /usr/bin/bashbug
-rwxr-xr-x 1 root root   39296 мая  5  2018 /usr/bin/buildhash
-rwxr-xr-x 1 root root    6332 ноя 22 20:40 /usr/bin/c_rehash
-rwxr-xr-x 1 root root  121464 янв 17 21:08 /usr/bin/dash
-rwxr-xr-x 1 root root     277 фев  9 14:02 /usr/bin/gvfs-trash
-rwxr-xr-x 1 root root  190752 янв 18 22:45 /usr/bin/mksquashfs
-rwxr-xr-x 1 root root   10376 янв 30  2016 /usr/bin/ppmflash
lrwxrwxrwx 1 root root       4 янв 24 12:01 /usr/bin/rbash -> bash
-rwxr-xr-x 1 root root   99104 янв 18 22:45 /usr/bin/unsquashfs
Легко видеть, что а). bash и dash различаются (и размером и датой), б). по умолчанию в качестве sh используется dash.
Чем они различаются?

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Программирование сценариев bash

Непрочитанное сообщение Olej » 15 фев 2019, 13:12

Olej писал(а): Легко видеть, что а). bash и dash различаются (и размером и датой), б). по умолчанию в качестве sh используется dash.
Чем они различаются?
Произошло это давно ... похоже в 2008г., во всех Debian/Ubuntu системах, описано это здесь: Spec
Rationale
Our default shell is currently bash, which is slow and very large as it is intended as a user login shell. While this is good for users, it is not the best shell for running shell scripts; there are far smaller and faster shells that provide POSIX compliance such as dash.
By changing the /bin/sh symlink from bash to dash we can have the best of both worlds.
...
DashAsBinSh/Spec (последним исправлял пользователь localhost 2008-08-06 16:22:08)

А детальное перечисление различий здесь: DashAsBinSh
In Ubuntu 6.10, the default system shell, /bin/sh, was changed to dash (the Debian Almquist Shell); previously it had been bash (the GNU Bourne-Again Shell). The same change will affect users of Ubuntu 6.06 LTS upgrading directly to Ubuntu 8.04 LTS. This document explains this change and what you should do if you encounter problems.

The default login shell remains bash. Opening a terminal from the menu or shortcut [crtl-alt-t] provides interactive bash. A script run from the desktop or file manager, through the dialogue 'run in terminal' will execute as POSIX dash.
...
DashAsBinSh (последним исправлял пользователь 1047481448-2 2017-12-16 09:23:41)

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Программирование сценариев bash

Непрочитанное сообщение Olej » 15 фев 2019, 13:16

Olej писал(а):Чем они различаются?
Debian Almquist shell
Debian Almquist shell (dash) — командная оболочка UNIX, намного более легковесная, чем bash, при этом POSIX-совместимая. dash занимает очень мало места на диске, но не может похвастаться богатой функциональностью. Некоторые отсутствующие функции, например, переменная $LINENO[4], требуются для совместимости с POSIX.

Dash — прямой потомок Almquist shell (ash) из NetBSD. Он был портирован под Linux Хербертом Сюем в начале 1997 года. Проект был переименован в dash в 2002 году.

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Программирование сценариев bash

Непрочитанное сообщение Olej » 24 июл 2021, 14:13

Olej писал(а):
24 май 2016, 16:42
Сделали и выложили (май 2016г.) новый перевод последней (как утверждается) редакции документа Advanced Bash-Scripting Guide: Полный ABS Guide.pdf (поскольку это частный ресурс, кому нужно - скачайте сразу, обсуждение со ссылками найдёте здесь: http://www.linuxim.ru/viewtopic.php?f=83&t=810 , если ссылка для скачивания потеряется):
Как и следовало ожидать - теперь по этим ссылка лежит какое-то Android-гавно! :-o
Нужно бы сверить свежие варианты по оригиналу:
Olej писал(а):
24 май 2016, 16:42
Mendel Cooper
Revision 10
10 Марта 2014
'PUBLICDOMAIN' release

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Программирование сценариев bash

Непрочитанное сообщение Olej » 24 июл 2021, 14:25

Olej писал(а):
24 июл 2021, 14:13
Нужно бы сверить свежие варианты по оригиналу:
Вот тут вот выложили (лежит пока ;-) ) версия нового перевода: Полный ABS Guide.pdf
В скачанном тексте находим:
Посильный перевод: Быков О.В. aka Oleg65
10 Марта 2014
История проверок
Revision 6.5
05 Апреля 2012
'TUNGSTENBERRY' release
Revision 6.6
27 Ноября 2012
'YTTERBIUMBERRY' release
Revision 10
10 Марта 2014
'PUBLICDOMAIN' release
Т.е. всё тот же релиз 10 от Mendel Cooper.

Аватара пользователя
bellic
Писатель
Сообщения: 379
Зарегистрирован: 02 сен 2022, 14:41
Откуда: Ростов-на-Дону
Контактная информация:

Re: программирование сценариев bash

Непрочитанное сообщение bellic » 02 сен 2022, 14:48

Доброго всем дня!
Помогите пожалуйста решить задачку:

Формирую текстовую переменную:

Код: Выделить всё

OUTPUT ="$(ls -l /dev/ | grep sd)"
Получаю:

Код: Выделить всё

echo "${OUTPUT}"
brw-rw---- 1 root floppy 8, 32 сент 2 06:28 sdc
brw-rw---- 1 root floppy 8, 33 сент 2 06:28 sdc1
Задача - присвоить переменной пусть той же OUTPUT значение sdc1 в конце текста...
Там может быть sda1 и sdd1...
Хочется далее выделенные символы использовать в команде:

Код: Выделить всё

sudo mount /dev/sdc1 /mnt
Подскажите как это сделать, кто знает!?
Последний раз редактировалось bellic 03 сен 2022, 08:30, всего редактировалось 2 раза.

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: программирование сценариев bash

Непрочитанное сообщение Olej » 02 сен 2022, 20:52

bellic писал(а):
02 сен 2022, 14:48
Задача - присвоить переменной пусть той же OUTPUT значение sdc1 в конце текста...
Там может быть sda1 и sdd1...

Код: Выделить всё

$ ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda3  /dev/sda5  /dev/sdb  /dev/sdb2  /dev/sdc  /dev/sdc1  /dev/sdc2  /dev/sdd  /dev/sdd1  /dev/sdd2

Код: Выделить всё

olej@R420:/dev$ ls -l /dev | awk '/sd/ { print $10 }'
sda
sda1
sda3
sda5
sdb
sdb2
sdc
sdc1
sdc2
sdd
sdd1
sdd2

Код: Выделить всё

olej@R420:/dev$ ls -l /dev | awk '/sd/ { print $10 }' | grep 1$
sda1
sdc1
sdd1

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: программирование сценариев bash

Непрочитанное сообщение Olej » 02 сен 2022, 21:04

bellic писал(а):
02 сен 2022, 14:48
Хочется далее выделенные символы использовать в команде:

Код: Выделить всё

olej@R420:/dev$ find /dev -type b -printf "%f\n" | grep 1$
find: ‘/dev/vboxusb’: Отказано в доступе
sdc1
sdd1
sda1
nvme0n1p1
nvme0n1
loop1

Код: Выделить всё

olej@R420:/dev$ find /dev -type b -printf "%f\n" | grep 1$ | grep ^sd
find: ‘/dev/vboxusb’: Отказано в доступе
sdc1
sdd1
sda1

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: программирование сценариев bash

Непрочитанное сообщение Olej » 02 сен 2022, 21:14

bellic писал(а):
02 сен 2022, 14:48
Хочется

Код: Выделить всё

olej@R420:~/2022$ ls -l sdN
-rw-rw-r-- 1 olej olej 95 сен  2 21:13 sdN

Код: Выделить всё

olej@R420:~/2022$ cat sdN
LIST=`ls -l /dev | awk '/sd/ { print $10 }'`

for SD in $LIST; do \
   echo $SD | grep 1$
done
Обратите внимание, что файл-скрипт даже может быть без флагов исполнения 'x':

Код: Выделить всё

olej@R420:~/2022$ sh sdN 
sda1
sdc1
sdd1

Аватара пользователя
bellic
Писатель
Сообщения: 379
Зарегистрирован: 02 сен 2022, 14:41
Откуда: Ростов-на-Дону
Контактная информация:

Re: программирование сценариев bash

Непрочитанное сообщение bellic » 02 сен 2022, 21:44

Доброго времени!
У меня получилось в двух вариантах:

Код: Выделить всё

user@wn25:~$ ls -l /dev | awk '/sd/ { print $10 }' | grep 1$
sdc1
и

Код: Выделить всё

find /dev -type b -printf "%f\n" | grep 1$ | grep ^sd
sdc1
Буду использовать первый...)))
Спасибо большое!

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя