Как мне создать постоянный псевдоним Bash?

382

Я хотел бы создать псевдоним для rmкоманды, чтобы получить подтверждающее сообщение после выполнения этой команды. Итак, я создаю псевдоним, как это alias rm='rm -i'. Но, насколько я знаю, это временный псевдоним, и он действует, пока вы не закроете терминал.

Как объясняется здесь, чтобы сохранить псевдоним постоянно, мне нужно выполнить ~/.bash_aliasesили ~/.bashrcкоманды в терминале и добавить мой псевдоним там. Но когда я выполняю, ~/.bashrcя получаю следующее сообщение об ошибке:

bash: /home/bakhtiyor/.bashrc: Permission denied

При запуске ~/.bash_aliasesя получаю другое сообщение об ошибке, подобное этому:

bash: /home/bakhtiyor/.bash_aliases: File or directory doesn't exist.

Какова актуальная проблема и как я могу ее решить?

Бахтиер
источник
2
ОТВЕТ - stackoverflow.com/a/2622711/1487102
neaumusic
alias rm='rm -i'не решает проблему использования rm случайным образом
qwr

Ответы:

429

Чтобы создать псевдоним, добавьте псевдоним в свой .bashrcфайл навсегда.

gedit ~/.bashrc

А затем добавьте свой псевдоним внизу.

альтернативный текст

Теперь выполните . ~/.bashrcв вашем терминале (должен быть пробел между .и ~/.bashrc.

Теперь вы можете проверить свой псевдоним.

альтернативный текст

karthick87
источник
5
@ karthick87 Вы написали: «Теперь выполните. ~ / .bashrc в вашем терминале (между. и ~ / .bashrc должен быть пробел.». Зачем нужен этот шаг?
Geek
5
что делает первый "." делать в. ~ / .bashrc?
Дзен
22
@Geek @Zen "Выполнить" было неправильным термином. Точка эквивалентна source. С . ~/.bashrc, вы источник вашего Баш. Выполнение файла запустит дочерний процесс, выполнит команды в этом процессе и вернется. Все, что делается в дочернем процессе, не влияет на родительский процесс (bash, из которого вы выполнялись). Вместо этого сорсинг (с точкой) действует точно так же, как если бы вы записали содержимое файла в терминал. Это то, что вы хотите. .bashrcпоставляется каждый раз, когда вы начинаете bash. Если вы внесете изменения, они не будут применены, пока вы не запустите новый bash или исходный код вручную.
Готье
@ButtleButkus - может потребоваться изменить настройки только одного пользователя, а не всей системы. В Ubuntu общесистемным файлом .bashrc является /etc/bash.bashrc
WillC
1
@ShubhamA. смотрите этот вопрос о поведении OSX
jandersen
254

Есть много способов создать псевдоним. Наиболее используемые способы:

  1. Добавить псевдонимы прямо в вашем ~/.bashrcфайле

    Например: добавить эти строки в ~/.bashrcфайл

    alias ll='ls -l'
    alias rm='rm -i'
    

    В следующий раз (после того, как вы вышли из / в или сделаны . ~/.bashrc) при вводе команда будет выполнена.rmrm -i

  2. Второй метод позволяет вам создать отдельный файл псевдонимов, так что вам не нужно будет вставлять их .bashrc, а в файл по вашему выбору. Сначала отредактируйте свой ~/.bashrcфайл и добавьте следующие строки, если они еще не существуют, или раскомментируйте их, если они есть:

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

    Сохраните его и закройте файл. После этого все, что вам нужно сделать, это создать ~/.bash_aliasesфайл и добавить туда псевдонимы с тем же форматом, который указан в первом методе.

    Содержание моего ~/.bash_aliasesфайла:

    alias cs='cd;ls'
aneeshep
источник
72
+1 за использование ~/.bash_aliases.
ændrük
Да, использование другого файла для псевдонимов намного более чисто, также переносимо между дистрибутивами. Я использую этот файл для, потому что некоторых псевдонимов недостаточно, и необходима функция. Так что будет гораздо проще, если вместо этого вы используете файл для этой задачи. У меня есть другой псевдоним -> alias aliases="xdg-open ~/.bash_aliases && source ~/.bash_aliases", поэтому псевдоним стал полезным при сохранении, и если вы допустите какую-либо ошибку, он объявит вас.
erm3nda
каким-то образом после того, как я добавил псевдоним, например alias ls='ls -althr', некоторые из указанных флагов не вступили в силу, в этом случае флаг -t не вступил в силу. ты знаешь почему?
Саджук
3
По умолчанию ~/.bashrcсодержит включение для ~/.bash_aliases, нет необходимости редактировать его.
Яакко
1
Не всегда ~ / .bashrc содержит включение для ~ / .bash_aliases, как было в моем случае с терминалом Ubuntu Windows 10, это решение оказалось очень удобным.
Хосе
19

Мне кажется, что ваша единственная проблема - просто попытаться выполнить .bashrc, когда он не исполняется. Но это не правильный способ сделать это; всякий раз, когда вы вносите изменения в этот файл, вы должны «выполнить» его командой:

source ~/.bashrc

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

Я предполагаю, что вторая ошибка была, потому что bash_aliases не существует. Это не обязательно, просто рекомендуется хранить ваши изменения отдельно и организованно. Он используется только в том случае, если он существует, и вы можете увидеть тест для него в .bashrc:

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

Это говорит о том, что если файл ~ / .bash_aliases существует, то запустите его.

Марти Фрид
источник
~/.bash_aliasesэто лучше. askubuntu.com/questions/194111/...
tomByrer
1
использование sourceкоманды заставило мои псевдонимы работать. +1
dspacejs
4
Просто для полноты: начальная точка на линии . ~/.bash_aliasesимеет то же значение, что и встроенная команда оболочки source. Я считаю, что это правильный ответ, объясняющий, что происходит.
Мелебиус
17

Проблема в том, что вы пытаетесь выполнить неисполняемый файл: это можно проверить с помощью:

ls -la ~/.bashrc
-rw-r--r-- 1 username username 3596 2010-08-05 17:17 /home/pt001424/.bashrc

Обратите внимание, что в первом столбце нет буквы «x - исполняемый файл» (права доступа к файлу).

Файлы профиля не являются исполняемыми файлами, вместо их загрузки вы загружаете их:

source /home/bakhtiyor/.bashrc

или же

. /home/bakhtiyor/.bashrc
Жоао Пинту
источник
7
echo "alias vps='ssh -X user@example.com'" >> ~/.bashrc

Это пример, который я искал, способ ввода нескольких букв на терминале («vps») для удаленного входа на сервер и включения переадресации X11, чтобы я мог запускать приложения с графическим интерфейсом, такие как «gedit», по сети.

Какой бы ни была команда / псевдоним команды, этот способ с оператором echo, кавычками и символом добавления вывода команды в файл (>>) работает для меня. Просто замените мою команду на нужную вам команду псевдонима и введите ее в свой терминал.

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

если вы используете ruby, вы можете установить aka, используя rubygem.

gem install aka2

использование

aka generate hello="echo helloworld" #add an alias
aka g hello="echo helloworld"  #add alias for lazy people

aka destroy hello #remove alias
aka d hello #remove alias for lazy people

rubygem автоматически установит ваш точечный файл, так что вам это не нужно. Проверьте это.

ytbryan
источник
4

Я написал эту полезную функцию, чтобы быстро создать новый псевдоним, а затем записать определение псевдонима в ~/.bash_aliases (если он существует) или ~/.bashrc.

СОВЕТ : Убедитесь, что ~/.bash_aliasesсуществует и выполняется в ~/.bashrc.

# -----------------------------------
#  Create a new permanent bash alias
#
#  @param $1 - name
#  @param $2 - definition
# -----------------------------------
new-alias () { 
  if [ -z "$1" ]; then
    echo "alias name:" && read NAME
  else
    NAME=$1
  fi

  if alias $NAME 2 > /dev/null > /dev/null; then
    echo "alias $NAME already exists - continue [y/n]?" && read YN
    case $YN in
      [Yy]* ) echo "okay, let's proceed.";;
      [Nn]* ) return;;
      * ) echo "invalid response." && return;;
    esac
  fi

  if [ -z "$2" ]; then
    echo "alias definition:" && read DEFINTION
  else
    DEFINTION="$2"
  fi

  if [ -f ~/.bash_aliases ]; then
    echo "alias $NAME=\"$DEFINTION\"" >> ~/.bash_aliases
  else
    echo "alias $NAME=\"$DEFINTION\"" >> ~/.bashrc
  fi

  alias $NAME="$DEFINTION"
}
blizzrdof77
источник
1
Хорошая идея, но небрежное использование этой функции может привести к сбою в .bashrcнескольких экземплярах aliasкоманды. Ваша функция определенно должна реализовать некоторые проверки, чтобы избежать таких помех.
Troublemaker-DV
Это верный момент. Есть ли у вас предлагаемый обходной путь, которым вы готовы поделиться @ Troublemaker-DV?
blizzrdof77
Не уверен, что это все еще актуально через 2 1/2 года, но ... На 1-м я бы запустил команду RC для команд псевдонимов, чтобы проверить, был ли этот псевдоним уже введен там, чтобы избежать дубликатов. Ваша проверка на наличие псевдонима не достаточно, потому что RC может быть уже «загрязнен» несколькими псевдонимами с одинаковыми именами.
Troublemaker-DV
0

Я бы предложил использовать /etc/bash.bashrc

Вы можете добавить строку в конце этого файла.

alias ok="ping google.com"

После размещения псевдонимов в каждой строке вы должны перезагрузить или повторно войти в систему.

Фахад Ахаммед
источник
7
«Я хотел бы предложить ..» и почему вы предлагаете это?
Муру
2
Вы не должны связываться с системным файлом, если только вы не хотите установить общесистемные настройки для всех пользователей. В персональной системе разница незначительна, но в дальнейшем связываться с системными файлами будет сложнее, поэтому вам, вероятно, все же стоит отдать предпочтение вашим личным точечным файлам для личных предпочтений (и это облегчает копирование настроек в другом месте в будущее тоже).
tripleee
1
Перезагрузка? Это действительно ужасный совет, НЕ ДЕЛАЙТЕ этого, особенно когда source /etc/bash.bashrcделаете все, что хотите в этом примере. Но стоит использовать ~/.bashrcили ~/.bash_aliasesвместо
Xen2050
@ Xen2050, я предложил перезагрузку, чтобы показать, что она работает после перезагрузки / перезагрузки. Кстати, даже другое чистое окно терминала также будет работать.
Фахад Ахаммед
1
Вы можете перейти на новое ядро ​​без перезагрузки, это не старые окна ;-)
Xen2050
0

Насколько я помню, bashrcесть или была строка, предлагающая не использовать его для псевдонимов напрямую. Решение заключается в использовании внешнего файла (ов). fooИ barпсевдонимы , которые были добавлены, но добавить файл должен быть «получен» (или просто открыть новый терминал). Пример как:bazbashrc

thufir@dur:~$ 
thufir@dur:~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias bar='echo foo'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias foo='echo foo'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
thufir@dur:~$ 
thufir@dur:~$ cat .bash_aliases 
alias foo='echo foo'
alias bar='echo foo'
alias baz='echo baz'

thufir@dur:~$ 
thufir@dur:~$ source .bashrc 
thufir@dur:~$ 
thufir@dur:~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias bar='echo foo'
alias baz='echo baz'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias foo='echo foo'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
thufir@dur:~$ 
thufir@dur:~$ baz
baz
thufir@dur:~$ 

теперь bazпсевдоним работает. Я только сейчас понял, что в предыдущем ответе упоминалась эта техника, но они похоронили Леду.

Суфир
источник