Jak utworzyć trwały alias Bash?

381

Chciałbym utworzyć alias do rmpolecenia, aby po wykonaniu tego polecenia pojawił się komunikat potwierdzający. Tworzę więc taki alias alias rm='rm -i'. Ale o ile wiem, jest to tymczasowy alias i żyje do momentu zamknięcia terminalu.

Jak to wyjaśnione tutaj , aby zapisać alias stale muszę wykonać ~/.bash_aliaseslub ~/.bashrcpolecenia w terminalu i dodać tam moje alias. Ale kiedy wykonuję, pojawia ~/.bashrcsię następujący komunikat o błędzie:

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

Po uruchomieniu ~/.bash_aliasespojawia się kolejny komunikat o błędzie:

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

Jaki jest rzeczywisty problem i jak mogę go rozwiązać?

Bakhtiyor
źródło
2
ODPOWIEDŹ - stackoverflow.com/a/2622711/1487102
neaumusic 10.09.19
alias rm='rm -i'nie rozwiązuje problemu przypadkowego używania rm
qwr

Odpowiedzi:

428

Aby utworzyć alias, dodaj go na stałe do swojego .bashrcpliku

gedit ~/.bashrc

A następnie dodaj swój alias na dole.

alternatywny tekst

Teraz uruchom . ~/.bashrcw swoim terminalu (pomiędzy .i) powinna znajdować się spacja ~/.bashrc.

Teraz możesz sprawdzić swój alias.

alternatywny tekst

karthick87
źródło
5
@ karthick87 napisałeś: „Teraz wykonaj. ~ / .bashrc w swoim terminalu (powinna istnieć przerwa między. i ~ / .bashrc.”. Dlaczego ten krok jest potrzebny?
Geek
5
co robi pierwszy „.” zrobić w. ~ / .bashrc?
Zen
22
@Geek @Zen „Wykonaj” nie było poprawnym terminem. Kropka jest równoważna z source. Dzięki . ~/.bashrc, ty źródłowego bash. Wykonanie pliku spowoduje uruchomienie procesu potomnego, wykonanie poleceń w tym procesie, a następnie powrót. Wszystko, co dzieje się w procesie potomnym, nie ma wpływu na proces macierzysty (bash, z którego wykonałeś). Zamiast tego pozyskiwanie (z kropką) działa dokładnie tak, jakbyś zapisał zawartość pliku w terminalu. To jest to, czego chcesz. .bashrcjest pozyskiwany za każdym razem, gdy zaczynasz bash. Jeśli wprowadzisz zmiany, nie zostaną one zastosowane, dopóki ręcznie nie uruchomisz nowej wersji bash lub źródła.
Gauthier
@ButtleButkus - może zmienić preferencje tylko jednego użytkownika, a nie całego systemu. W Ubuntu ogólnosystemowym plikiem .bashrc jest /etc/bash.bashrc
WillC
1
@ShubhamA. zobacz to pytanie dotyczące zachowania OSX
jandersen
253

Istnieje wiele sposobów tworzenia aliasu. Najczęściej używane sposoby to:

  1. Dodaj aliasy bezpośrednio do ~/.bashrcpliku

    Na przykład: dołącz te linie do ~/.bashrcpliku

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

    Następnym razem (po wylogowaniu / zalogowaniu lub zakończeniu . ~/.bashrc) po wpisaniu polecenia zostanie wykonane.rmrm -i

  2. Druga metoda pozwala utworzyć osobny plik aliasów, więc nie będziesz musiał go umieszczać .bashrc, ale do wybranego pliku. Najpierw edytuj ~/.bashrcplik i dodaj następujące wiersze, jeśli jeszcze nie istnieją, lub odkomentuj je, jeśli tak jest:

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

    Zapisz i zamknij plik. Następnie wszystko, co musisz zrobić, to utworzyć ~/.bash_aliasesplik i dodać tam swoje aliasy, w tym samym formacie określonym w pierwszej metodzie.

    Zawartość mojego ~/.bash_aliasespliku:

    alias cs='cd;ls'
aneeshep
źródło
71
+1 za użycie ~/.bash_aliases.
ændrük
Tak, użycie innego pliku do aliasów jest znacznie bardziej czyste, również przenośne między dystrybucjami. Używam tego pliku, ponieważ niektóre aliasy są niewystarczające i potrzebna jest funkcja. Jest więc o wiele czystszy, jeśli zamiast tego używasz pliku do tego zadania. Mam inny alias -> alias aliases="xdg-open ~/.bash_aliases && source ~/.bash_aliases", więc alias stał się pomocny w oszczędzaniu, a jeśli popełnisz jakiś błąd, zareklamuje cię.
erm3nda
jakoś po dodaniu aliasu, na przykład alias ls='ls -althr'niektóre z podanych flag nie zadziałały, w tym przypadku flaga -t nie zadziałała. wiesz dlaczego?
Sajuuk
3
Domyślnie ~/.bashrczawiera włączenie dla ~/.bash_aliases, nie trzeba go edytować.
Jaakko
1
Nie zawsze ~ / .bashrc zawiera włączenie ~ / .bash_aliases, jak to było w moim przypadku z terminalem Ubuntu Windows 10, to rozwiązanie było bardzo przydatne.
Jose
19

Wydaje mi się, że twoim jedynym problemem jest po prostu próba uruchomienia .bashrc, gdy nie jest wykonywalny. Ale to nie jest właściwy sposób, aby to zrobić; za każdym razem, gdy wprowadzasz zmiany w tym pliku, powinieneś go „wykonać” poleceniem:

source ~/.bashrc

W przeciwnym razie po prostu utworzy nową powłokę, uruchomi plik w środowisku nowej powłoki, a następnie odrzuci to środowisko po wyjściu, tracąc w ten sposób zmianę. Pozyskując skrypt, uruchamia się on w bieżącej powłoce, więc pozostanie aktywny.

Zakładam, że drugi błąd był spowodowany tym, że bash_aliases nie istnieje. Nie jest to wymagane, po prostu zalecane jest oddzielne i uporządkowane zmiany. Jest używany tylko wtedy, gdy istnieje i można go przetestować w .bashrc:

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

Oznacza to, że jeśli plik ~ / .bash_aliases istnieje, uruchom go.

Marty Fried
źródło
~/.bash_aliasesjest lepiej. askubuntu.com/questions/194111/…
tomByrer
1
użycie sourcepolecenia sprawiło, że moje aliasy działały. +1
dspacejs
4
Dla kompletności: początkowa kropka w linii . ~/.bash_aliasesma takie samo znaczenie, jak wbudowane polecenie powłoki source. Uważam, że jest to poprawna odpowiedź, wyjaśniająca, co się dzieje.
Melebius
17

Problem polega na tym, że próbujesz wykonać plik wykonywalny: Możesz to sprawdzić za pomocą:

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

Uwaga: w pierwszej kolumnie nie ma litery „x - plik wykonywalny” (uprawnienia do plików).

Pliki profilów nie są plikami wykonywalnymi, zamiast ich wykonywania ładujesz je za pomocą:

source /home/bakhtiyor/.bashrc

lub

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

Oto przykład, którego szukałem, sposób na wpisanie kilku liter na terminalu („vps”), aby zdalnie zalogować się na serwerze i włączyć przekazywanie X11, dzięki czemu mogę uruchamiać aplikacje GUI, takie jak „gedit” przez sieć.

Niezależnie od polecenia / polecenia aliasowanego, ta metoda z instrukcją echo, znakami cudzysłowu i symbolem dołączania wyniku polecenia do pliku (>>) działa dla mnie. Po prostu zamień moje polecenie na potrzebne alias i wpisz je w swoim terminalu.

użytkownik80638
źródło
Cytowanie tutaj jest nieco trudne. W tym przykładzie użycie podwójnych cudzysłowów jest bezproblemowe, ale jeśli tekst w cudzysłowach zawiera znaki dolara, ukośniki odwrotne itp., Musisz zrozumieć, w jaki sposób powłoka przetwarza je wewnątrz podwójnych cudzysłowów. Możesz przełączyć się na pojedyncze cudzysłowy na zewnątrz i podwójne cudzysłowy wewnątrz, ale nadal musisz zrozumieć, w jaki sposób Bash przetwarza podwójne cudzysłowy w definicji aliasu.
tripleee
5

jeśli używasz ruby, możesz zainstalować aka przy użyciu rubygem.

gem install aka2

stosowanie

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 automatycznie prześle Twój plik kropkowy, więc nie musisz. Sprawdź to.

ytbryan
źródło
4

Napisałem tę przydatną funkcję, aby szybko utworzyć nowy alias, a następnie napisać definicję aliasu na ~/.bash_aliases (jeśli istnieje) lub ~/.bashrc.

WSKAZÓWKA : Upewnij się, że ~/.bash_aliasesistnieje i jest wykonywana w ~/.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
źródło
1
Dobry pomysł, ale nieostrożne korzystanie z tej funkcji może prowadzić do śmieci .bashrcz wieloma instancjami aliaspolecenia. Twoja funkcja zdecydowanie musi wdrożyć niektóre kontrole, aby uniknąć takiego bałaganu.
Troublemaker-DV
To jest ważny punkt. Czy masz sugerowane obejście, które chcesz udostępnić @ Troublemaker-DV?
blizzrdof77,
Nie jestem pewien, czy nadal jest rzeczywisty 2 1 / 2yo później, ale ... Na 1. grep RC poprosiłbym o polecenia aliasu, aby sprawdzić, czy ten alias został już tam wprowadzony, aby uniknąć duplikatów. Twoje sprawdzenie istnienia aliasu nie wystarczy, ponieważ RC może być już „zanieczyszczony” wieloma aliasami o tej samej nazwie.
Troublemaker-DV,
0

Sugerowałbym użycie /etc/bash.bashrc

Możesz dodać linię na końcu tego pliku.

alias ok="ping google.com"

Po umieszczeniu aliasów w linii należy ponownie uruchomić komputer lub ponownie się zalogować.

Fahad Ahammed
źródło
7
„Proponuję ..” i dlaczego to sugerujesz?
muru
2
Nie powinieneś mieć problemów z plikiem systemowym, chyba że chcesz zainstalować ustawienie systemowe dla wszystkich użytkowników. W systemie osobistym różnica jest marginalna, ale późniejsza bałagan z plikami systemowymi jest bardziej skomplikowana, więc prawdopodobnie powinieneś nadal preferować własne osobiste pliki kropkowe dla osobistych preferencji (i to ułatwia kopiowanie ustawień gdzie indziej w także przyszłość).
tripleee
1
Restart? To naprawdę okropna rada, NIE rób tego, zwłaszcza gdy source /etc/bash.bashrcw tym przykładzie zrobisz wszystko, czego chcesz. Ale powinien użyć ~/.bashrclub ~/.bash_aliaseszamiast
Xen2050
@ Xen2050, zasugerowałem ponowne uruchomienie, aby pokazać, że działa po ponownym uruchomieniu / ponownym uruchomieniu. Nawiasem mówiąc, zadziała również inne czyste okno terminala.
Fahad Ahammed
1
Możesz uaktualnić do nowego jądra bez restartu, to nie są stare okna ;-)
Xen2050
0

Jak pamiętam, bashrcma lub miał wiersz sugerujący, aby nie używać go bezpośrednio do aliasów. Rozwiązaniem jest użycie plik (i) zewnętrzny. fooI barpseudonimy zostały dodane, ale dodać plik musi być „pochodzą” (lub po prostu otworzyć nowy terminal). Przykład jako: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:~$ 

teraz bazalias działa. Dopiero teraz zdałem sobie sprawę, że poprzednia odpowiedź wspomniała o tej technice, ale zakopali lede.

Thufir
źródło