Форум программистов, компьютерный форум, киберфорум
Наши страницы
Shell, Bash
Войти
Регистрация
Восстановить пароль
 
Zhenyab345
0 / 0 / 0
Регистрация: 06.01.2017
Сообщений: 6
1

Расшифровка bash функции

14.01.2020, 10:15. Просмотров 328. Ответов 10
Метки нет (Все метки)

Не могу понять ,что делает этот bash файл =(
А если быть точнее, дрОкон sed-a.

Bash
1
2
3
4
5
6
7
8
9
10
11
DST_DRIVE='sdc'
 
find_drive(){
    cat /proc/partitions | sed "
/ $DST_DRIVE$/{
    s/^.*\(...\)$/\1/p;
}
d;"
 
printf "1"
}
Спасибо за внимание=)
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2020, 10:15
Ответы с готовыми решениями:

Расшифровка bash файла
Не могу понять ,что делает этот bash файл =( #!/bin/bash # Usage: hi...

Получить результат из функции в Bash
Есть функция main, которая обращается за результатом к функции Checker. При выполнении скрипта,...

bash. встраиваемые функции. или иной способ.
всем привет. на примере прошлого кода, пытаюсь использовать встроенные условия. #!/bin/sh ...

BASH to C и
WBR, all! Пользовался поиском по форуму-не нашел подходящей темы (если подобная тема все-таки...

Bash
Что-то я не вижу на форуме раздел, посвященный bash? Он называется как-то по другому, или его...

10
nezabudka
1087 / 443 / 163
Регистрация: 28.06.2015
Сообщений: 1,038
Записей в блоге: 15
14.01.2020, 15:36 2
В строке где встречается шаблон 'sdc' выводит три последних символа

Добавлено через 3 минуты
Другими словами
Bash
1
sed '/sdc/!d;s/.*\(...\)$/\1/' /proc/partitions
Добавлено через 10 минут
Я пропустила якорь конца строки в шаблоне.
Тогда так если в файле есть шаблон 'sdc' в виде слова (отделен пробельным символом) и он завершает строку то выводится в stdout
а вместе с последней командой printf 1
получится 'sdc1'

Добавлено через 2 минуты
Все же лучше выделять только переменные из тела sed двойными кавычками если в этом есть необходимость
Bash
1
sed '/ '"$DST_DRIVE"'$/!d;s/.*\(...\)$/\11/' /proc/partitions
Добавлено через 12 минут
Но мне кажется здесь есть грубейшая ошибка в плане логики. Как я понимаю
задумка была такая. Если в файле есть слово 'sdc' в конце строки то вывести
только одно совпадение прибавив единичку в конце.
Если это так то лучше воспользоваться
Bash
1
sed '/ '"$DST_DRIVE"'$/!d;s/.*\(...\)$/\11/;q' /proc/partitions
1
nezabudka
1087 / 443 / 163
Регистрация: 28.06.2015
Сообщений: 1,038
Записей в блоге: 15
15.01.2020, 09:15 3
Хотя я и тут не права. По логике ваша функция выведет или
Bash
1
2
sdc
1
если есть одно совпадение или
Bash
1
2
3
sdc
sdc
1
если несколько совпадений или просто '1' если совпадений нет
Если конечно эта не ошибка в построении алгоритма функции

Добавлено через 40 минут
Я воткнула флешку и у меня появились 2 новых последних поля
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat /proc/partitions 
major minor  #blocks  name
 
   8        0  488386584 sda
   8        1  264198144 sda1
   8        2          1 sda2
   8        3     358400 sda3
   8        4   98828288 sda4
   8        5    7811072 sda5
   8        6  116712448 sda6
  11        0    1048575 sr0
   7        0      76628 loop0
   7        1      22968 loop1
   7        2      45240 loop2
   7        3      55932 loop3
   7        4     160440 loop4
   8       16    3915776 sdb
   8       17    3914752 sdb1
Моя флешка это устройство sdb и на ней один раздел
Если принять во внимание что на вашей системе флешка может отображаться sdc
то вывод вашей функции будет
Bash
1
2
sdb
1
Не зависимо есть ли на вашей флешке разделы или нет
Исходя из стиля написания вашей функции я предположу что вам необходима следующая команда
Bash
1
2
3
4
DST_DRIVE=sdb1
grep -q "$DST_DRIVE"'$' /proc/partitions &&
{ echo То что я хочу сделать; echo если флешка $DST_DRIVE обнаружена; } ||
{ echo То что я хочу сделать; echo если флешки $DST_DRIVE нет; }
Вывод значения не нужен потому как значение само находится в шаблоне
0
Zhenyab345
0 / 0 / 0
Регистрация: 06.01.2017
Сообщений: 6
15.01.2020, 09:17  [ТС] 4
del
0
15.01.2020, 09:17
nezabudka
1087 / 443 / 163
Регистрация: 28.06.2015
Сообщений: 1,038
Записей в блоге: 15
15.01.2020, 09:25 5
Zhenyab345, Потому что в любом случае команда printf 1
дает положительный результат

Добавлено через 2 минуты
Просто проэкспериментируйте. Запустите мою команду из поста #3
с флешкой и без и посмотрите результат. Можете эту команду оформить как скрипт
для удобства
0
Zhenyab345
0 / 0 / 0
Регистрация: 06.01.2017
Сообщений: 6
15.01.2020, 09:30  [ТС] 6
Да, я экспериментировал. У меня 2 винчестера и поэтому DST_DRIVE=sdс(флешка). Но сейчас попробую поиграть с Вашим кодом из поста 3.
Хочу сказать Вам спасибо, что откликнулись.
0
nezabudka
1087 / 443 / 163
Регистрация: 28.06.2015
Сообщений: 1,038
Записей в блоге: 15
15.01.2020, 11:22 7
Zhenyab345, Похоже команда printf 1
осталась не закоментированной со времени отладки программы
0
skouzmine
54 / 48 / 14
Регистрация: 27.02.2016
Сообщений: 197
17.01.2020, 22:03 8
@nezabudka, мне кажется вместо удаления можно просто нп типа


Код
DST_DRIVE='sda'; cat /proc/partitions \
> | sed -n "/$DST_DRIVE$/s|^.*\\(...\\)$|\\1|p"
Код
sda
0
Изображения
Тип файла: png capture_sed_np.png (24.7 Кб, 2 просмотров)
nezabudka
1087 / 443 / 163
Регистрация: 28.06.2015
Сообщений: 1,038
Записей в блоге: 15
17.01.2020, 23:09 9
skouzmine, Мое мнение, вместо всего этого огорода
вам нужен детектор вставленной флешки
Bash
1
grep 'sdc$' /proc/partitions
Вставте это в вашу функцию
или просто закоментируйте строчку #printf 1
Без функции, напрямую было бы гораздо проще
опция -q для этого и существует что бы не выводить
на stdout но возвращать true или false
Не нравится мой вариант с && и || можете смело втавлять эту конструкцию
в условное выражение
Bash
1
2
3
4
5
if grep -q "$DST_DRIVE$" /proc/partitions; then
  echo Флешка найдена
else
  echo Вставте флешку
fi
Добавлено через 9 минут
Может вы напишете что именно вы хотите сделать
и добавите вывод команды со вставленной флешкой
Bash
1
cat /proc/partitions
Или выложите весь скрипт, я попробую разобраться
1
skouzmine
54 / 48 / 14
Регистрация: 27.02.2016
Сообщений: 197
17.01.2020, 23:37 10
это к владельцу скрипта Zhenyab345 - не ко мне. с ролью седа похоже разобрались
1
Zhenyab345
0 / 0 / 0
Регистрация: 06.01.2017
Сообщений: 6
20.01.2020, 11:26  [ТС] 11
Прошу прощение за молчание, всем спасибо. Изначально просто задача стояла прошить raspberry PI этим чужим скриптом. (данный скрипт написан для прошивки raspberry PI линуксом, настройки линукса, и загрузки специализированного кастомного ПО).
Сходу не получалось. Начал лезть глубже, оказалось из-за printf "1" не мог прошить. Т.е. определял флэшку как sdb1, а не sdb, к примеру.

А вообще функция как я понял, определяет, найдена ли флешка заданная исходными данными(DST_DRIVE='sdc').

Если интересно, где используется:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
set -e
 
find_drive(){
    cat /proc/partitions | sed "
/ $DST_DRIVE$/{
    s/^.*\(...\)$/\1/p;
}
d;"
}
 
stage0(){
#major minor  #blocks  name   win-mounts
#
#    8     0 312571224 sda
#    8     1  26214400 sda1
#    8     2 127526912 sda2   C:\
#    8     3 158828544 sda3   D:\
#    8    16  15360000 sdb
#    8    17     44927 sdb1   E:\
 
    echo '
Look at what place we have Flash.
Normal look:
...
    8    16  15558144 sdb
    8    17     15360 sdb1   E:\
 
Drive like "sdb" will be used to write OS image
' >&2
 
    cat /proc/partitions
 
    D=`find_drive`
 
    if test "$D"
    then echo '
Found configured "$DST_DRIVE" drive: "'"$D"'"'
    else echo "Not found Flash drive:'$DST_DRIVE'
 
Insert Flash or re-configure this script."
    fi >&2
    echo "$D"
}
Честно говоря, сейчас на мне висит параллельно более срочная другая задача. Ее сделаю и вернусь. Хочу испопробовать, что вы все понаписали)
Всем спасибо.
0
20.01.2020, 11:26
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2020, 11:26

Bash
Подскажите Bash-скрипт для сохранения файлов сайта. Например я ввожу адрес сайта и страничка...

Bash
Я немного не понимаю, как мне из интерактивного режима перейти в командный, может кто знает...

bash
Почему через терминал sudo ./1.sh А кнопка запуска на верхней панели с этой командой нет?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.