Como crio um alias permanente do Bash?

382

Gostaria de criar um alias para rmcomando, a fim de ter uma mensagem de confirmação depois de executar este comando. Então, eu estou criando um alias como este alias rm='rm -i'. Mas, tanto quanto eu sei, esse é um apelido temporário e permanece até você fechar o terminal.

Como é explicado aqui para salvar o alias permanentemente, preciso executar ~/.bash_aliasesou ~/.bashrccomandos no terminal e adicionar meu alias lá. Mas quando executo ~/.bashrc, recebo a seguinte mensagem de erro:

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

Quando executo ~/.bash_aliases, recebo outra mensagem de erro como esta:

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

Qual é o problema real e como posso resolvê-lo?

Bakhtiyor
fonte
2
Resposta - stackoverflow.com/a/2622711/1487102
neaumusic
alias rm='rm -i'não resolve o problema de usar rm
aleatoriamente

Respostas:

429

Para criar um alias permanentemente, adicione o alias ao seu .bashrcarquivo

gedit ~/.bashrc

E adicione seu alias na parte inferior.

texto alternativo

Agora execute . ~/.bashrcno seu terminal (deve haver um espaço entre o .e ~/.bashrc.

Agora você pode verificar seu alias.

texto alternativo

karthick87
fonte
5
. @ karthick87 você escreveu ".. Agora executar ~ / .bashrc em seu terminal (deve haver uma lacuna entre o e ~ / .bashrc" Porque é que este passo necessário?
Geek
5
o que faz o primeiro '.' faça dentro ~ / .bashrc?
Zen
22
@Geek @Zen "Executar" não era o termo correto. O ponto é equivalente a source. Com . ~/.bashrc, você fornece sua festança. A execução do arquivo iniciaria um processo filho, executaria os comandos nesse processo e retornaria. Tudo o que é feito no processo filho não afeta o processo pai (o bash a partir do qual você executou). Em vez disso, a fonte (com o ponto) age exatamente como se você tivesse escrito o conteúdo do arquivo no terminal. Isso é o que você quer. .bashrcé fornecido sempre que você inicia uma festança. Se você fizer alterações, elas não serão aplicadas até que você inicie uma nova base ou fonte manualmente.
Gauthier
@ButtleButkus - pode querer alterar apenas as preferências de um usuário em vez de todo o sistema. No Ubuntu o .bashrc de todo o sistema é /etc/bash.bashrc
WillC
1
@ShubhamA. veja esta questão para o comportamento OSX
jandersen
253

Existem várias maneiras de criar um alias. As formas mais usadas são:

  1. Adicione aliases diretamente no seu ~/.bashrcarquivo

    Por exemplo: acrescente estas linhas ao ~/.bashrcarquivo

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

    Na próxima vez em . ~/.bashrcque você digitar, rmo rm -icomando será executado.

  2. O segundo método permite criar um arquivo de aliases separado, para que você não precise inseri-los .bashrc, mas para um arquivo de sua escolha. Primeiro, edite seu ~/.bashrcarquivo e adicione as seguintes linhas, se ainda não existirem, ou remova o comentário se houver:

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

    Salve-o e feche o arquivo. Depois disso, tudo que você precisa fazer é criar um ~/.bash_aliasesarquivo e adicionar seus aliases, com o mesmo formato especificado no primeiro método.

    Conteúdo do meu ~/.bash_aliasesarquivo:

    alias cs='cd;ls'
aneeshep
fonte
72
+1 para usar ~/.bash_aliases.
ændrük
Sim, usar outro arquivo para apelidos é muito mais limpo, também portátil entre distros. Eu uso esse arquivo porque alguns alias não são suficientes e é necessária uma função. Portanto, é mais limpo se você usar um arquivo para essa tarefa. Eu tenho outro apelido -> alias aliases="xdg-open ~/.bash_aliases && source ~/.bash_aliases", então o apelido se tornou útil para salvar, e se você cometer algum erro, ele o anunciará.
Erm3nda
de alguma forma, depois que adicionei o alias, como alias ls='ls -althr', algumas das sinalizações fornecidas não entrariam em vigor; nesse caso, a sinalização -t não entrou em vigor. Você sabe por quê?
Sajuuk 22/03
3
Por padrão, ~/.bashrccontém inclusão para ~/.bash_aliases, não há necessidade de editá-lo.
Jaakko 14/05
1
Nem sempre o ~ / .bashrc contém inclusão para ~ / .bash_aliases, como foi no meu caso com o terminal Ubuntu Windows 10, esta solução foi muito útil.
307 Jose
19

Parece-me que seu único problema é simplesmente tentar executar .bashrc quando não é executável. Mas essa não é a maneira correta de fazer isso; sempre que você fizer uma alteração neste arquivo, você deve "executá-lo" pelo comando:

source ~/.bashrc

Caso contrário, ele simplesmente criará um novo shell, executará o arquivo no ambiente do novo shell e descartará esse ambiente quando ele sair, perdendo assim as alterações. Ao fornecer o script, ele é executado dentro do shell atual e, portanto, permanece em vigor.

Estou assumindo que o segundo erro foi porque bash_aliases não existe. Não é necessário, apenas recomendado para manter suas alterações separadas e organizadas. É usado apenas se existir, e você pode ver o teste em .bashrc:

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

Isso indica que, se o arquivo ~ / .bash_aliases existir, execute-o.

Marty Fried
fonte
~/.bash_aliasesé melhor. askubuntu.com/questions/194111/…
tomByrer
1
usar o sourcecomando fez meus aliases funcionarem. +1
dspacejs
4
Apenas para completar: O ponto inicial na linha . ~/.bash_aliasestem o mesmo significado que o comando interno do shell source. Acho que essa é a resposta correta, explicando o que está acontecendo.
Melebius
17

O problema é que você está tentando executar um arquivo não executável: Você pode verificar isso com:

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

Observe que não há letra "x - executável" na primeira coluna (permissões de arquivo).

Os arquivos de perfil não são arquivos executáveis. Em vez de executá-los, você os carrega:

source /home/bakhtiyor/.bashrc

ou

. /home/bakhtiyor/.bashrc
João Pinto
fonte
7
echo "alias vps='ssh -X [email protected]'" >> ~/.bashrc

Este é um exemplo que eu estava procurando, uma maneira de digitar algumas letras no terminal ("vps") para efetuar login remotamente em um servidor e ativar o encaminhamento X11 para que eu possa executar aplicativos de interface gráfica como "gedit" pela rede.

Qualquer que seja o comando / comando com alias, dessa maneira, com a instrução eco, aspas e o símbolo para anexar a saída de um comando a um arquivo (>>) funciona para mim. Apenas substitua meu comando pelo comando de alias necessário e digite-o no seu terminal.

user80638
fonte
A citação aqui é um pouco complicada. Neste exemplo, o uso de aspas duplas é problemático, mas se o texto entre aspas contiver cifrões, barras invertidas, etc., será necessário entender como o shell as processa entre aspas duplas. Você pode mudar para aspas simples no exterior e aspas duplas no interior, mas ainda precisa entender como o Bash processa as aspas duplas na definição de alias.
Tripleee
5

se você estiver usando ruby, poderá instalar o aka usando rubygem.

gem install aka2

uso

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

o rubygem criará automaticamente seu arquivo de ponto para que você não precise. Confira.

ytbryan
fonte
4

Eu escrevi essa função útil para criar rapidamente um novo alias e, em seguida, escreva a definição do alias para ~/.bash_aliases (se existir) ou ~/.bashrc.

DICA : verifique se ~/.bash_aliasesexiste e é executado em ~/.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
fonte
1
Boa ideia, mas o uso descuidado dessa função pode levar à lixeira .bashrccom várias instâncias de aliascomando. Sua função definitivamente precisa implementar alguns exames para evitar essa confusão.
Troublemaker-DV
Este é um ponto válido. Você tem uma solução sugerida que deseja compartilhar no @ Troublemaker-DV?
blizzrdof77
Não tenho certeza se ainda é real 2 1 / 2yo mais tarde, mas ... No primeiro dia, eu solicitava ao RC que os comandos de alias checassem, se esse alias já foi inserido lá para evitar duplicatas. Sua verificação da existência de um alias não é suficiente, porque o RC já pode estar "contaminado" com vários aliases de mesmo nome.
Troublemaker-DV
0

Eu sugeriria usar /etc/bash.bashrc

Você pode adicionar uma linha no final desse arquivo.

alias ok="ping google.com"

Depois de colocar os aliases por linha, você precisará reiniciar ou entrar novamente.

Fahad Ahammed
fonte
7
"Eu sugeriria .." e por que você sugeriria isso?
muru 9/08/2015
2
Você não deve mexer com o arquivo do sistema, a menos que deseje instalar especificamente uma configuração em todo o sistema para todos os usuários. Em um sistema pessoal, a diferença é marginal, mas a bagunça com os arquivos do sistema é mais complicada, então você provavelmente ainda deve preferir seus próprios arquivos de pontos pessoais para preferências pessoais (e isso facilita a cópia das configurações em outro local) o futuro também).
Tripleee
1
Reiniciar? Esse é um péssimo conselho, NÃO FAÇA isso, principalmente quando source /etc/bash.bashrctudo o que você deseja neste exemplo. Mas deve usar ~/.bashrcou em ~/.bash_aliasesvez disso
Xen2050 18/01/19
@ Xen2050, sugeri reiniciar para mostrar que funciona após reiniciar / reiniciar. A propósito, até outra janela limpa do terminal também funcionará.
Fahad Ahammed
1
Você pode atualizar para um novo kernel sem reiniciar, isso não é janelas de idade ;-)
Xen2050
0

Pelo que me lembro, bashrctem, ou teve, uma linha sugerindo não usá-la para aliases diretamente. A solução é usar um arquivo externo. Os aliases fooe barforam adicionados, mas para adicionar bazo bashrcarquivo deve ser "originário" (ou, basta abrir um novo terminal). Exemplo como:

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:~$ 

agora o bazapelido funciona. Só agora percebi que uma resposta anterior havia mencionado essa técnica, mas eles haviam enterrado o lede.

Thufir
fonte