Как легко сделать команду псевдонима постоянной? [дубликат]

На этот вопрос уже есть ответ здесь:

Я ищу везде, и почти все предлагали открыть ~ / .bashrc или ~ / .bash_aliases , затем поместил туда команду псевдонима, я создал функцию с именем palias как постоянную функцию псевдонима и поместил ее в ~ / .bashrc :

function palias(){ echo "alias $1='$2'" >> /home/User/.bashrc;}

Итак, теперь, если я хочу навсегда установить псевдоним какой-либо команды, я просто:

palias update "sudo apt-get update"

Интересно, есть ли встроенная команда, подобная этой функции, или что-то подобное для установки из репозиториев?

5
задан 8 October 2014 в 19:24

2 ответа

Нет никакого удара, встроенного для добавления постоянных псевдонимов. Такие псевдонимы создаются путем добавления их к конфигурационному файлу, который получен интерактивными оболочками, как Вы имеете, покончили .bashrc.

Но Вы могли бы рассмотреть изменение Вашего palias() реализация, заставляя это поместить псевдонимы в отдельный файл. Я думаю, что это можно считать улучшением по шести причинам:

  1. Файл, который главным образом редактируется автоматически, может быть отдельным из файла, который главным образом редактируется вручную. Если необходимо видеть то, что произошло - из любопытства, или исследовать проблему - это разделение может быть полезным. (Или если функция будет случайно много раз вызываться, создавая большое количество ненужных строк, то размер ущерба будет несколько более ограничен.)

  2. Путем помещения человека, автоматически сгенерированные определения псевдонима в другом месте, чем .bashrc, Вы создаете систему, которая "выполняет незаметную работу", который часто является, что хотят люди, когда они ищут специализированное встроенное для выполнения задачи.

  3. .bashrc является уже обычно вполне сложным. Будет легче считать и изменить в несвязанных целях, если это не будет заполнено многими пользовательскими автоматически добавленными псевдонимами.

  4. Простые реализации palias() - включая то, что Вы записали и что я собираюсь рекомендовать - создаст плохие строки, если файл, к которому они добавляют, не будет уже завершен новой строкой (или пробел). Обычно текстовые редакторы делают это для Вас, но возможно случайно закончить текстовый файл без новой строки, в этом случае palias() создаст вместе портившую строку, которая может или не может быть корректной, и которую так или иначе было бы очень трудно считать. Путем помещения псевдонимов в отдельный файл, который Вы редко, или по крайней мере менее часто, редактируете вручную, Вы уменьшаете риск этого.

  5. Если Вы когда-нибудь разворачиваете Ваш palias() реализация, чтобы считать существующее содержание ее конечного файла, например, дать полезные предупреждения, может быть намного легче сделать так, если, как может предполагаться, состоит полностью из определений псевдонима. (Или, для более сложного парсинга: полностью определений псевдонима и строк, которые, как предполагают, были неправильными.)

  6. Уже широко предлагается (хотя по общему признанию не как любой вид сильного замечания) поместить новые псевдонимы в отдельный файл: .bash_aliases

    Посмотрите, Как я создаю постоянный псевдоним Bash? для получения дополнительной информации о местах для помещения псевдонимов.

Значение по умолчанию .bashrc файлы в Ubuntu содержат код:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Таким образом, если Вы создаете .bash_aliases, это будет использоваться. Команда для определения palias() функция может затем быть:

palias() { echo "alias $1='$2'" >> ~/.bash_aliases; }

Та команда должна все еще войти .bashrc, но псевдонимы, которые это создает, будут помещены в .bash_aliases.

Более сложные реализации возможны. Вы могли:

  1. Выполните определение, а также добавление его, таким образом, это сразу применимо. Это предлагается в ответе osirisgothra. Я использовал бы:

    palias() { echo "alias $1='$2'" >> ~/.bash_aliases; alias "$1=$2"; }
    
  2. Проверьте для обеспечения .bash_aliases не существует, пуст, или завершенный новой строкой, и если это непусто, но не завершенное новой строкой, добавьте новую строку до определения псевдонима.

    palias() {
        local target=~/.bash_aliases
        [[ -f "$target" && -n $(tail -c1 "$target") ]] && echo >> "$target"
        echo "alias $1='$2'" >> "$target"
    }
    

    См. ответ Gilles для Добавления недостающих новых строк в нескольких файлах для получения дополнительной информации об обнаружении недостающих новых строк с tail.

  3. Проверьте и предупредите об определении псевдонима, который был уже определен в .bash_aliases.

    Ploutox предложил ту идею. Но я не рекомендую использовать grep $1 ~/.bash_aliases или подобный, потому что это произведет частые ложные положительные стороны в любое время $1 соответствия любая часть определения другого псевдонима и случайные ложные отрицательные стороны. Ситуация далее сложна тем, как некоторый допустимый удар искажает, взятый в качестве регулярных выражений, соответствуйте больше, чем себя-+ и . на самом деле привыкните в команде и исказите имена - и некоторые не соответствуют даже себе.
    grep "alias $1=" лучше, но смягчает проблему только частично. Продвижение ^ в шаблоне вполне прилично соответствовал бы только продвижению alias name из определения, но не решают проблему regexp метасимволов в $1, при использовании grep -F лишил бы все метасимволы их особого значения, но при этом предотвратил бы ^ от того, чтобы быть используемым.

    grepлуг .bashrc таким образом еще хуже, чем .bash_aliases, как существует чрезвычайно неограниченное разнообразие текста, который может быть частью того файла, главным образом вне любых определений псевдонима.

    Если Вы хотите проверить на псевдонимы, которые определяются в текущей оболочке, записаны ли они в .bash_aliases (или где угодно), можно использовать alias "$1" (или выполненный alias без аргументов и соответствия, тщательно, против его вывода). Кредит переходит к muru для этой идеи. Это действительно имеет недостаток этим при определении псевдонима с alias проверять его и затем делать его постоянным с palias, Вы получите предупреждение даже при том, что это еще не было постоянным, и все прекрасно.

    Проверять новые постоянные псевдонимы по содержанию .bash_aliases, Вы могли сделать что-то вроде этого:

    palias() {
        local target=~/.bash_aliases
    
        if grep -Pqs '^[ \t]*alias[ \t]+\Q'"$1"'\E\=' "$target"; then
            printf "%s: %s: warning: defining \`%s' again in %s\n" \
                        "$0" "$FUNCNAME" "$1" "$target" >&2
        fi
    
        echo "alias $1='$2'" >> "$target"
    }
    

    Это, кажется, работает хорошо, хотя я подозреваю, что существуют более изящные пути. (Возможно [ \t]* должен быть удален, если Вы берете ведущий пробел прежде alias как предположение, что это - часть многострочного определения псевдонима.) Это будет неправильно функционировать если \E появляется в $1, но метасимволы оболочки и символы заключения в кавычки как \ не допустимы на имена псевдонима, таким образом, Вы не должны будете давать это как вход.
    Идеально, на любом неправильном входе, любая стоящая с пользователем функция, которую Вы вызываете, не выполнила бы операции кроме печати полезного сообщения об ошибке. Но по природе palias(), по крайней мере, если Вы не готовы сделать ее определение намного более сложным (см. ниже), нагрузка разумного входа уже падает главным образом на пользователя. Можно записать непсевдонимы и исказить синтаксические ошибки определения к .bash_aliases с этой функцией, и в то время как это, вероятно, приемлемо, учитывая путь, Вы будете использовать palias(), дросселирование на \E незначительно в сравнении.

    Более серьезно, alias name1='def1' name2='def2' ... совершенно хороший синтаксис для alias команда, но я не попытался проанализировать определения псевдонима, данные как последующие аргументы alias в .bash_aliases, поскольку я верю правильно определению, где первый незаключенный в кавычки пробел происходит, было бы нетривиально.

    Поэтому, если Вы используете вышеупомянутое palias() реализация и также иногда вручную определяет псевдонимы в .bash_aliases (или безотносительно файла Вы используете как $target), необходимо определить всего один псевдоним на alias ... строка, если Вы хотите иметь надежное поведение предупреждения.
    Это также не распознает определения псевдонима направо от a ; или другие соединительные слова, например, к отдельной цепочке alias команды на той же строке, но кажется маловероятным, что Вы хотели бы выполнить в этом .bash_aliases.

  4. Синтаксический анализ $1 гарантировать его - допустимое название псевдонима.

  5. Синтаксический анализ $2 для попытки, чтобы выяснить, является ли это вероятное тело для псевдонима, и если это не, затем предупредите, перестаньте работать, или (где применимый) заключают его в кавычки правильно. Например, что происходит если a ' символ появляется в $2?

  6. Сделайте более простую версию этого вместо этого, просто проверив на и обращения ' в $2.

Но Вы, вероятно, не хотите беспокоиться любым из этого. Вы знаете, как Ваша функция работает, ее ограничения, и как использовать ее правильно. Я вижу четыре опции для Вас, которые одновременно довольно хороши и довольно просты:

  1. Просто продолжайте использовать то, что Вы имеете теперь.
  2. Используйте реализацию как выше, вставляя псевдонимы .bash_aliases вместо .bashrc.
  3. Сделайте третий файл для автоматически добавленных псевдонимов и источник что файл отдельно (любой в .bashrc или .bash_alises.
  4. Не используйте a palias() функция вообще, и просто вручную добавляет псевдонимы путем редактирования .bash_aliases или .bashrc.
2
ответ дан 23 November 2019 в 10:28

Я предлагаю (конечно, Вы не имеете к), помещение eval "$_" после echo команда, таким образом, псевдоним добавляется сразу же, и a grep -Pq "alias $1" && return в запуске, чтобы удостовериться, что (1) у Вас нет дублирующихся имен псевдонима, (2) искажает, определяются сразу же вместо того, чтобы ожидать их, чтобы быть снабженным.

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

Я поместил довольно большую работу в мой собственный .bashrc за эти годы - я действительно совместно использую его в соответствии с проектом, названным gxbase, но так как это - "мои предпочтения", это, скорее всего, не то, что "хотят другие люди". Параметры конфигурации являются очень персональной вещью. Большинство людей ожидает вещи быть похожим /etc/skel/.bashrc, и материал как завершение удара прекращает работать при установке слишком многих пользовательских опций :) Just для забавы, хотя, моей ссылкой является http://gitorious.org/gxbase. Файл находится в extras/my.bashrc/* (см. PS в основе, если заинтересовано).

Что касается Вашего вопроса, существуют многие люди там, которые отправляют их так называемые 'окончательные .bashrc настройки, но увы они только окончательны для них, мой ответ: Вы будете самыми счастливыми, если Вы будете создавать этот файл сами и будете верить мне из любви ко всему, что это является святым; сделайте [офлайновые] резервные копии!!!:) 'Твердая (печатная) копия' является хорошим способом запланировать его далее, если Вы хотите стать еще более творческими!


PS: содержание .bashrc-мерзавца является ветвлением из gitsh проекта, так большая часть кредита, для которого переходит к тому парню, и perlconsole и aptsh интеграция также не являются моими (полностью). Необходимо будет установить кивнувший perlconsole и aptsh файлы для интегрирования этого полностью в виртуальные каталоги.

1
ответ дан 23 November 2019 в 10:28

Другие вопросы по тегам:

Похожие вопросы: