Страница 1 из 2
Помогите расставить кавычки в алиасе
Добавлено: 16 янв 2019, 23:20
StarMAUGLI
Добрый день,
решил тут себе алиасов в баш наплодить, полистал ссылочек. В одной из них посоветовали алиасы делать для самых популярных команд на компьютере и для определения этих популярных команд предложили такую команду
Код: Выделить всё
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: не найден
Понимаю, что виноваты кавычки, но как их правильно расставить - не могу разобрать.
Посоветуете?
Помогите расставить кавычки в алиасе
Добавлено: 16 янв 2019, 23:30
slant
Я в принципе за это alias'ы недолюбливаю. Они нормально работают для простых команд, но когда у тебя такая вот цепочка, да еще в нее может передаваться сложная строчка - задолбаешься экранирование спецсимволов правильно выставлять.
Для подобного я просто пишу скрипт, обзываю как нравится, и кидаю его ~/bin/ или /usr/local/bin/ - в зависимости от того должен он быть только для меня или общесистемным.
Результат тот-же, а затрат времени куда меньше.

Помогите расставить кавычки в алиасе
Добавлено: 16 янв 2019, 23:41
StarMAUGLI
slant, скрипты я пока не научился писать...
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 00:02
slant
Это даже проще чем алиасы.
1. Создаем файл:
touch filename
(Для скрипта расширение не требуется, хотя и возможно - дело вкуса и удобства. Хотя если подходить совсем формально - в линуксе расширений вообще нету как отдельной сущности. Просто последняя часть имени точка+что-то используется как оное, но технически - ничем нигде не отделено от имени файла).
2. Пишем в файл с помощью
текстового редактора (или любым другим способом) команду. Например ту самую, что вы пытаетесь запихнуть в алиас. Но пишете просто так, как будто прямо в командной строке, без всяких модификаций.
3. Сохраняем файл.
4. Выставляем ему исполнимый бит:
chmod +x filename
Простейший скрипт готов. Осталось положить его в одно из мест на которые указывает переменная окружения $PATH (если не положить, вызывать придется по полному пути а не как команду - просто по имени).
Посмотреть какие каталоги входят в $PATH можно так:
echo $PATH
Главное - потом эти скрипты легко можно скопировать как скопом так и отдельно в любую другую систему. А вот алиасы придется редактировать заново, т.к. в другой системе уже могут быть свои, и если просто переписать файл с ними - можно их затереть.
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 00:52
StarMAUGLI
slant, вроде я где-то читал, что на скрипты тоже можно алиасы делать?
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 03:19
slant
Алиасы все равно на что делать. По своей сути, это просто правило замены для 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, и т.д. В первой строчке - указание на интерпретатор, а далее сам код на соответствующем языке.
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 07:00
zuzabrik
Сомневаюсь что вы это станете читать, но может быть пригодится. Это самое полное руководство по bash переведенное на русский язык -
Advanced Bash-Scripting Guide
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 08:17
Dja
Эту всю байду в скрипт, а алиас уже на выполнение скрипта
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 14:15
StarMAUGLI
slant писал(а): ↑16 янв 2019, 23:30
Для подобного я просто пишу скрипт, обзываю как нравится, и кидаю его ~/bin/
Dja писал(а): ↑17 янв 2019, 08: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
└─ $
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 14:20
zuzabrik
StarMAUGLI, потому что алиас ll
уже прописан, это короткая форма для ls -l
Он прописан в файле ~/.bashrc
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 14:21
Dja
StarMAUGLI, это команда очистки повторов из истории?
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 14:54
StarMAUGLI
Dja писал(а): ↑17 янв 2019, 14:21
это команда очистки повторов из истории?
StarMAUGLI писал(а): ↑16 янв 2019, 23:20
посоветовали алиасы делать для самых популярных команд на компьютере и для определения этих популярных команд предложили такую команду
StarMAUGLI писал(а): ↑16 янв 2019, 23:20
Команда свои функции вполне нормально отрабатывает,
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 15:01
StarMAUGLI
zuzabrik писал(а): ↑17 янв 2019, 14:20
потому что алиас ll уже прописан, это короткая форма для ls -l
ээээ... вопрос изначально про команду, а дальше в процессе обсуждения перешел в вопрос о скрипте alias_candidat, который почему-то тоже не работает...
а ll - я самолично из какого-то блога списывал и он работает в отличие от... , так что про него в курсе и по нему вопросов нет.

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

Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 15:13
zuzabrik
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
Секрет в том что по умолчанию баш блокирует историю в неинтерактивном шеле. Проверил у себя, у меня отработало нормально.
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 15:20
StarMAUGLI
zuzabrik писал(а): ↑17 янв 2019, 15:13
поменяй содержимое файла на это
Ура! Заработало!!!
zuzabrik писал(а): ↑17 янв 2019, 15:13
Секрет в том что по умолчанию баш блокирует историю в неинтерактивном шеле.
Вот вроде все слова по отдельности понимаю, а общий смысл как-то ускользает. "Неинтерактивный шелл" в моем контексте это как? Баш или не баш?
Или "баш на баш"?Открыл консоль bash - ebash!
И если шелл "неинтерактивный", то тогда какой баш их блокирует?
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 15:24
zuzabrik
StarMAUGLI, В интерактивном режиме, оболочка читает команды, вводимые пользователем, с устройства tty. Кроме того, такая оболочка считывает конфигурационные файлы на запуске, выводит строку приглашения к вводу (prompt), и, по-умолчанию, разрешает управление заданиями. Пользователь имеет возможность взаимодействия с оболочкой.
Сценарий всегда запускается в неинтерактивном режиме. Но, не смотря на это, он сохраняет доступ к своему tty. И даже может эмулировать интерактивный режим работы.
Слова не мои, это цитата

Проще говоря интерактивный, это когда она моргает тебе курсором и ждет пока ты с ней поговоришь.
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 15:43
slant
StarMAUGLI писал(а): ↑17 янв 2019, 14:15
Чего-то, ребят, не работает этот рецепт:
Конкретно для этого скрипта первая строчка
#!/bin/bash
излишняя. Т.к. действительно вызывает запуск скрипта через вызов еще одной копии bash в не интерактивном режиме. А вот без оной - скрипт выполнится в текущей оболочке как последовательность введенных команд.
Помогите расставить кавычки в алиасе
Добавлено: 17 янв 2019, 15:47
Dja
Не по теме
zuzabrik писал(а): ↑17 янв 2019, 15:24
и ждет пока ты с ней поговоришь
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"