Помогите расставить кавычки в алиасе

Языки программирования, IDE, компиляторы, интерпретаторы, гипервизоры и виртуальные среды
Правила форума
Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Версия ОС вместе с разрядностью. Пример: LM 18.1 x64, LM Sarah x32 2. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 3. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 4. Суть. Желательно с выводом консоли, логами. 5. Скрин. Просьба указывать 1, 2 и 3 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1550
Зарегистрирован: 10 сен 2016, 07:16
Решено: 15
Откуда: Москва
Благодарил (а): 639 раз
Поблагодарили: 181 раз

Помогите расставить кавычки в алиасе

Сообщение StarMAUGLI » 16 янв 2019, 20:20

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

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

history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n10
Команда свои функции вполне нормально отрабатывает, но я захотел для начала из нее и сделать алиас и заключил желаемую команду в кавычки

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

alias als_candidat="history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n10"
Но при обновлении баша я получаю следующие ошибки

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

bash: alias:  CMD[a]/count*100 %: не найден
bash: alias:  a;}' | grep -v ./ | column -c3 -s : не найден
bash: alias:  -t | sort -nr | nl |  head -n10: не найден
Понимаю, что виноваты кавычки, но как их правильно расставить - не могу разобрать.
Посоветуете?

Решение slant » 17 янв 2019, 12:43
StarMAUGLI писал(а):
17 янв 2019, 11:15
Чего-то, ребят, не работает этот рецепт:
Конкретно для этого скрипта первая строчка #!/bin/bash излишняя. Т.к. действительно вызывает запуск скрипта через вызов еще одной копии bash в не интерактивном режиме. А вот без оной - скрипт выполнится в текущей оболочке как последовательность введенных команд.

Перейти к ответу ➙

Аватара пользователя

slant
Сообщения: 1832
Зарегистрирован: 21 июн 2017, 15:09
Решено: 29
Благодарил (а): 14 раз
Поблагодарили: 789 раз

Помогите расставить кавычки в алиасе

Сообщение slant » 16 янв 2019, 20:30

Я в принципе за это alias'ы недолюбливаю. Они нормально работают для простых команд, но когда у тебя такая вот цепочка, да еще в нее может передаваться сложная строчка - задолбаешься экранирование спецсимволов правильно выставлять.

Для подобного я просто пишу скрипт, обзываю как нравится, и кидаю его ~/bin/ или /usr/local/bin/ - в зависимости от того должен он быть только для меня или общесистемным.
Результат тот-же, а затрат времени куда меньше. :)

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1550
Зарегистрирован: 10 сен 2016, 07:16
Решено: 15
Откуда: Москва
Благодарил (а): 639 раз
Поблагодарили: 181 раз

Помогите расставить кавычки в алиасе

Сообщение StarMAUGLI » 16 янв 2019, 20:41

slant, скрипты я пока не научился писать...

Аватара пользователя

slant
Сообщения: 1832
Зарегистрирован: 21 июн 2017, 15:09
Решено: 29
Благодарил (а): 14 раз
Поблагодарили: 789 раз

Помогите расставить кавычки в алиасе

Сообщение slant » 16 янв 2019, 21:02

Это даже проще чем алиасы. :)

1. Создаем файл: touch filename (Для скрипта расширение не требуется, хотя и возможно - дело вкуса и удобства. Хотя если подходить совсем формально - в линуксе расширений вообще нету как отдельной сущности. Просто последняя часть имени точка+что-то используется как оное, но технически - ничем нигде не отделено от имени файла).
2. Пишем в файл с помощью текстового редактора (или любым другим способом) команду. Например ту самую, что вы пытаетесь запихнуть в алиас. Но пишете просто так, как будто прямо в командной строке, без всяких модификаций.
3. Сохраняем файл.
4. Выставляем ему исполнимый бит: chmod +x filename

Простейший скрипт готов. Осталось положить его в одно из мест на которые указывает переменная окружения $PATH (если не положить, вызывать придется по полному пути а не как команду - просто по имени).
Посмотреть какие каталоги входят в $PATH можно так: echo $PATH

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

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1550
Зарегистрирован: 10 сен 2016, 07:16
Решено: 15
Откуда: Москва
Благодарил (а): 639 раз
Поблагодарили: 181 раз

Помогите расставить кавычки в алиасе

Сообщение StarMAUGLI » 16 янв 2019, 21:52

slant, вроде я где-то читал, что на скрипты тоже можно алиасы делать?

Аватара пользователя

slant
Сообщения: 1832
Зарегистрирован: 21 июн 2017, 15:09
Решено: 29
Благодарил (а): 14 раз
Поблагодарили: 789 раз

Помогите расставить кавычки в алиасе

Сообщение slant » 17 янв 2019, 00:19

Алиасы все равно на что делать. По своей сути, это просто правило замены для bash - "если тебе сказали Х - выполни Y". И все.

Скрипт и настоящий бинарник с точки зрения вызова мало чем отличаются (в основном тонкостями в наследовании прав доступа). Для обоих признаком исполняемости служит установленный executable бит. Только скрипт передается командному интерпретатору (по умолчанию), или другой программе. Какой именно - можно задать в самом скрипте. Делается это в первой строчке скрипта. Например так:

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

#!/bin/bash
echo hello world!
/usr/local/bin/myprogram
(Здесь явное указание bash в качестве командного интерпретатора для дальнейшего текста).
Практически происходит то же самое как если бы мы запустили скрипт вот так: bash myscript (в этом случае myscript мог бы не иметь установленного executable bit т.к. в этом случае он будет отдан как обычный текст непосредственно bash во время вызова оного).

Есть кстати маленький трюк. Правим первую строчку так: #!/bin/bash -x
И наш скрипт будет выполняться в режиме отладки - показывая содержимое переменных после каждой команды. Полезно в отладке больших скриптов. Это на будущее.

А вообще -таким же образом можно оформить скрипты на любом языке - perl, python, php, и т.д. В первой строчке - указание на интерпретатор, а далее сам код на соответствующем языке.

Аватара пользователя

zuzabrik
Сообщения: 1590
Зарегистрирован: 29 авг 2016, 09:08
Решено: 19
Благодарил (а): 103 раза
Поблагодарили: 497 раз

Помогите расставить кавычки в алиасе

Сообщение zuzabrik » 17 янв 2019, 04:00

Сомневаюсь что вы это станете читать, но может быть пригодится. Это самое полное руководство по bash переведенное на русский язык - Advanced Bash-Scripting Guide
Наш IRC-канал для общения: #linuxmint-ru на сервере irc.spotchat.org
Для захода откройте HexChat, выберите сервер Linux Mint и наберите в чате /join #linuxmint-ru
Или любым другим удобным способом ;)

Аватара пользователя

Dja
Сообщения: 6018
Зарегистрирован: 27 авг 2016, 17:03
Решено: 26
Откуда: Voskresensk
Благодарил (а): 865 раз
Поблагодарили: 642 раза

Помогите расставить кавычки в алиасе

Сообщение Dja » 17 янв 2019, 05:17

Эту всю байду в скрипт, а алиас уже на выполнение скрипта

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1550
Зарегистрирован: 10 сен 2016, 07:16
Решено: 15
Откуда: Москва
Благодарил (а): 639 раз
Поблагодарили: 181 раз

Помогите расставить кавычки в алиасе

Сообщение StarMAUGLI » 17 янв 2019, 11:15

slant писал(а):
16 янв 2019, 20:30
Для подобного я просто пишу скрипт, обзываю как нравится, и кидаю его ~/bin/
Dja писал(а):
17 янв 2019, 05:17
Эту всю байду в скрипт, а алиас уже на выполнение скрипта
Чего-то, ребят, не работает этот рецепт:

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

┌─ mugalem ~/bin 
└─ $ history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n20
     1  161  32.2%  sudo
     2  21   4.2%   joxi
     3  19   3.8%   bru
     4  14   2.8%   type
     5  12   2.4%   history
     6  11   2.2%   xsane
     7  10   2%     traceroute
     8  10   2%     ls
     9  10   2%     cat
    10  9    1.8%   ping
    11  9    1.8%   curl
    12  8    1.6%   cd
    13  7    1.4%   sl
    14  7    1.4%   df
    15  6    1.2%   pinta
    16  6    1.2%   locate
    17  5    1%     wget
    18  5    1%     newbs
    19  5    1%     ifconfig
    20  5    1%     flameshot
┌─ mugalem ~/bin 
└─ $ /home/mugalem/bin/alias_candidat 
┌─ mugalem ~/bin 
└─ $ ll
итого 28K
drwxr-xr-x  2 mugalem mugalem 4,0K янв 17 14:07 ./
drwxr-xr-x 73 mugalem mugalem 4,0K янв 17 14:05 ../
-rwxr-xr-x  1 mugalem mugalem  338 янв 17 14:07 alias_candidat*
-rw-------  1 mugalem mugalem   93 янв 16 01:39 .directory
-rwxr-xr-x  1 mugalem mugalem  107 янв 17 14:03 ReStart_NetworkManager.sh*
-rwxr-xr-x  1 mugalem mugalem  105 июл 12  2018 Start_NetworkManager.sh*
-rwxr-xr-x  1 mugalem mugalem  104 июл 12  2018 Stop_NetworkManager.sh*
Скрипты рядом - работают нормально. Проверил.
Разрешения все судя по выхлопу идентичные рабочим скриптам. Владелец и группы тоже.
Единственное отличие, в тех 3-х скриптах sudo требуется, а в этом скрипте - нет.
Содержимое файла alias_candidat

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

#!/bin/bash
# Поиск в хистори самых популярных команд. Для последующего анализа и создания алиасов.
history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n20
Пробовал запускать скрипт с опцией -x
Выхлоп - следующий

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

┌─ mugalem ~/bin 
└─ $ /home/mugalem/bin/alias_candidat 
+ history
+ awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}'
+ head -n20
+ nl
+ sort -nr
+ column -c3 -s ' ' -t
+ grep -v ./
┌─ mugalem ~/bin 
└─ $ 

Аватара пользователя

zuzabrik
Сообщения: 1590
Зарегистрирован: 29 авг 2016, 09:08
Решено: 19
Благодарил (а): 103 раза
Поблагодарили: 497 раз

Помогите расставить кавычки в алиасе

Сообщение zuzabrik » 17 янв 2019, 11:20

StarMAUGLI, потому что алиас ll уже прописан, это короткая форма для ls -l
Он прописан в файле ~/.bashrc
Наш IRC-канал для общения: #linuxmint-ru на сервере irc.spotchat.org
Для захода откройте HexChat, выберите сервер Linux Mint и наберите в чате /join #linuxmint-ru
Или любым другим удобным способом ;)

Аватара пользователя

Dja
Сообщения: 6018
Зарегистрирован: 27 авг 2016, 17:03
Решено: 26
Откуда: Voskresensk
Благодарил (а): 865 раз
Поблагодарили: 642 раза

Помогите расставить кавычки в алиасе

Сообщение Dja » 17 янв 2019, 11:21

StarMAUGLI, это команда очистки повторов из истории?

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1550
Зарегистрирован: 10 сен 2016, 07:16
Решено: 15
Откуда: Москва
Благодарил (а): 639 раз
Поблагодарили: 181 раз

Помогите расставить кавычки в алиасе

Сообщение StarMAUGLI » 17 янв 2019, 11:54

Dja писал(а):
17 янв 2019, 11:21
это команда очистки повторов из истории?
StarMAUGLI писал(а):
16 янв 2019, 20:20
посоветовали алиасы делать для самых популярных команд на компьютере и для определения этих популярных команд предложили такую команду
StarMAUGLI писал(а):
16 янв 2019, 20:20
Команда свои функции вполне нормально отрабатывает,

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1550
Зарегистрирован: 10 сен 2016, 07:16
Решено: 15
Откуда: Москва
Благодарил (а): 639 раз
Поблагодарили: 181 раз

Помогите расставить кавычки в алиасе

Сообщение StarMAUGLI » 17 янв 2019, 12:01

zuzabrik писал(а):
17 янв 2019, 11:20
потому что алиас ll уже прописан, это короткая форма для ls -l
ээээ... вопрос изначально про команду, а дальше в процессе обсуждения перешел в вопрос о скрипте alias_candidat, который почему-то тоже не работает... :dash2:
а ll - я самолично из какого-то блога списывал и он работает в отличие от... , так что про него в курсе и по нему вопросов нет. :-D
Последний раз редактировалось пользователем 1 StarMAUGLI; всего редактировалось раз: 17

Аватара пользователя

Dja
Сообщения: 6018
Зарегистрирован: 27 авг 2016, 17:03
Решено: 26
Откуда: Voskresensk
Благодарил (а): 865 раз
Поблагодарили: 642 раза

Помогите расставить кавычки в алиасе

Сообщение Dja » 17 янв 2019, 12:02

StarMAUGLI, хм... У меня все алиасы в ~/.bashrc где им и место. Т.е. если я что-то подзабыл захожу в файл и смотрю...
19-01-17-150509.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1550
Зарегистрирован: 10 сен 2016, 07:16
Решено: 15
Откуда: Москва
Благодарил (а): 639 раз
Поблагодарили: 181 раз

Помогите расставить кавычки в алиасе

Сообщение StarMAUGLI » 17 янв 2019, 12:10

Dja, ты не понял
я как раз туда (или если точнее в файл .bash_alias, это вроде считается более верным идеологически) их и складирую. Но по некоторому размышлению (и после некоторого изучения этой темы в интернете) я пришел к выводу, что делать алиасы на все команды подряд, особенно экзотические и редкоиспользуемые смысла нет. А нужны алиасы на те команды, которые более или менее регулярно используешь. Лучший способ узнать какие же команды используются регулярно, это просмотреть хистори. Для этого и была нужна эта команда. Я попытался сделать из нее алиас - у меня не получилось. Ты и Слант посоветовали сделать скрипт - в этом есть смысл, т.к. алиас на редкоиспользуюмую команду не особенно нужен, если только для примера... Но дело в том, что в качестве скрипта эта команда тоже работать не хочет. Я показал под спойлером, что команда сама по себе работает, а в качестве скрипта - нет. Там же я показал, что права на файлы идентичные с рабочими скриптами. Там же под следующим спойлером, я показал, что именно записано в скрипте. А еще под следующим показал, что попадает в выхлоп если перевести скрипт в режим отладки.
Если нужно еще что-то показать, то я готов, ибо моя фантазия временно истощилась.
Dja - прикольные команды у тебя в башрц. :thumbs:
Последний раз редактировалось пользователем 1 StarMAUGLI; всего редактировалось раз: 17

Аватара пользователя

zuzabrik
Сообщения: 1590
Зарегистрирован: 29 авг 2016, 09:08
Решено: 19
Благодарил (а): 103 раза
Поблагодарили: 497 раз

Помогите расставить кавычки в алиасе

Сообщение zuzabrik » 17 янв 2019, 12:13

StarMAUGLI, поменяй содержимое файла на это

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

#!/bin/bash

HISTFILE=~/.bash_history
set -o history
history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n20

Секрет в том что по умолчанию баш блокирует историю в неинтерактивном шеле. Проверил у себя, у меня отработало нормально.
Наш IRC-канал для общения: #linuxmint-ru на сервере irc.spotchat.org
Для захода откройте HexChat, выберите сервер Linux Mint и наберите в чате /join #linuxmint-ru
Или любым другим удобным способом ;)

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1550
Зарегистрирован: 10 сен 2016, 07:16
Решено: 15
Откуда: Москва
Благодарил (а): 639 раз
Поблагодарили: 181 раз

Помогите расставить кавычки в алиасе

Сообщение StarMAUGLI » 17 янв 2019, 12:20

zuzabrik писал(а):
17 янв 2019, 12:13
поменяй содержимое файла на это
Ура! Заработало!!!
zuzabrik писал(а):
17 янв 2019, 12:13
Секрет в том что по умолчанию баш блокирует историю в неинтерактивном шеле.
Вот вроде все слова по отдельности понимаю, а общий смысл как-то ускользает. "Неинтерактивный шелл" в моем контексте это как? Баш или не баш? Или "баш на баш"?Открыл консоль bash - ebash!
И если шелл "неинтерактивный", то тогда какой баш их блокирует?
Последний раз редактировалось пользователем 2 StarMAUGLI; всего редактировалось раз: 17

Аватара пользователя

zuzabrik
Сообщения: 1590
Зарегистрирован: 29 авг 2016, 09:08
Решено: 19
Благодарил (а): 103 раза
Поблагодарили: 497 раз

Помогите расставить кавычки в алиасе

Сообщение zuzabrik » 17 янв 2019, 12:24

StarMAUGLI, В интерактивном режиме, оболочка читает команды, вводимые пользователем, с устройства tty. Кроме того, такая оболочка считывает конфигурационные файлы на запуске, выводит строку приглашения к вводу (prompt), и, по-умолчанию, разрешает управление заданиями. Пользователь имеет возможность взаимодействия с оболочкой.

Сценарий всегда запускается в неинтерактивном режиме. Но, не смотря на это, он сохраняет доступ к своему tty. И даже может эмулировать интерактивный режим работы.

Слова не мои, это цитата :-D
Проще говоря интерактивный, это когда она моргает тебе курсором и ждет пока ты с ней поговоришь.
Наш IRC-канал для общения: #linuxmint-ru на сервере irc.spotchat.org
Для захода откройте HexChat, выберите сервер Linux Mint и наберите в чате /join #linuxmint-ru
Или любым другим удобным способом ;)

Аватара пользователя

slant
Сообщения: 1832
Зарегистрирован: 21 июн 2017, 15:09
Решено: 29
Благодарил (а): 14 раз
Поблагодарили: 789 раз

Помогите расставить кавычки в алиасе

Сообщение slant » 17 янв 2019, 12:43

StarMAUGLI писал(а):
17 янв 2019, 11:15
Чего-то, ребят, не работает этот рецепт:
Конкретно для этого скрипта первая строчка #!/bin/bash излишняя. Т.к. действительно вызывает запуск скрипта через вызов еще одной копии bash в не интерактивном режиме. А вот без оной - скрипт выполнится в текущей оболочке как последовательность введенных команд.

Аватара пользователя

Dja
Сообщения: 6018
Зарегистрирован: 27 авг 2016, 17:03
Решено: 26
Откуда: Voskresensk
Благодарил (а): 865 раз
Поблагодарили: 642 раза

Помогите расставить кавычки в алиасе

Сообщение Dja » 17 янв 2019, 12:47

Не по теме
zuzabrik писал(а):
17 янв 2019, 12:24
и ждет пока ты с ней поговоришь
:hm:
StarMAUGLI, вот еще кусочек
alias PCS="cd ~/PCs/"
alias вирт="cd /media/hardD/dja/VirtualShare/"
alias SMBQ="/home/dja/PCs/smbq.sh"
alias SMBT="/home/dja/PCs/smbt.sh"
alias мыло="cd ~/Clouds/MailRu/"
alias яру="cd ~/Clouds/YaDisk/"
alias шуттер="cd ~/Clouds/YaDisk/Screens/Shutter/"
alias скрот="cd ~/Clouds/YaDisk/Screens/Scrot/"
alias лскрот="scrot -scd 5"
alias манс="cd ~/Clouds/YaDisk/docs/documents/mans/"
alias медиа="cd /media/"
alias темп="cd ~/Clouds/YaDisk/temp"
alias сумо="sudo umount"
alias умо="sudo mount"
alias хард="cd /media/hardD/"
alias фе="screenfetch"

Вернуться в «Программирование, скриптинг, виртуализация»