Alias - komenda powłoki Bash

Jeśli:

  • masz problemy z zapamiętywaniem skomplikowanych komend Basha lub innych programów wywoływanych przez wiersz poleceń
  • nie lubisz wpisywać w terminalu długich poleceń z podkomendami i przełącznikami

istnieje rozwiązanie twoich problemów! Jest to komenda powłoki Bash o nazwie alias.

Komendę alias można wywołać bez żadnego parametru:

alias

wyświetli wtedy listę wszystkich zdefiniowanych aliasów dostępnych w danym terminalu.

Tworzenie aliasów

Żeby utworzyć nowy alias należy wywołać:

alias NAME=VALUE

gdzie:

  • NAME oznacza nazwę nowej “komendy” do wywoływania w wierszu poleceń
  • VALUE jest komendą, lub ciągiem komend, która zostanie wywołana naprawdę. Jeśli chcemy, żeby VALUE zawierało spację należy wszystko umieścić w parze apostrofów (‘) lub cudzysłowów (“)

Przykłady użycia:

alias rf='fm -rf'
alias ..='cd ..'
alias cwd='cd `pwd`'

Od teraz :

  • komenda rf <ścieżka_do_folderu> będzie usuwać foldery,
  • komenda .. przechodzić do folderu wyżej w drzewie hierarchii folderów,
  • komenda cwd będzie odświeżać aktywny folder.

Tworzenie permanentnych aliasów

Problem z aliasami jest tylko jeden. Działają tylko w ramach terminala w którym zostały zdefiniowane. Można to rozwiązać w prosty sposób poprzez stworzenie wszystkich aliasów w pliku, np. pod nazwą ~/.bash_aliases, a następnie wczytywania go za pomocą komendy source. Teraz po otwarciu nowego terminala wystarczy wywołać:

source ~/.bash_aliases

by cieszyć się swoimi aliasami w każdym terminalu.

Automatyczne wczytywanie aliasów

Można to jednak jeszcze bardziej uprościć. Przy starcie każdego nowego terminala jest wczytywany plik ~/.bashrc. Wystarczy na końcu tego pliku dodać:

source ~/.bash_aliases

lub bezpieczniej:

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

Dodatkowy if uchroni nas przed błędem, gdy plik ~/.bash_aliases nie istnieje. Kropka na początku drugiej linii jest aliasem na source.

Dodatkowo do pliku ~/.bash_aliases warto dodać aliasy:

alias vish='vim ~/.bashrc'
alias srcsh='source ~/.bashrc'

Niezniszczalne aliasy

Używanie aliasów nie jest niczym nowym. Możliwe, że w waszej dystrybucji będzie już istnieć plik ~/.bash_aliases czekający na uzupełnienie lub nawet będzie już wczytywany w pliku ~/.bashrc. Także cała powyższa procedura jest opisana na wielu stronach i blogach.

Mój główny problem z aliasami polegał na tym, że gdy już miałem uzbierany pokaźny zestaw aliasów ułatwiających mi życie padł mi dysk w służbowym laptopie. Komputer poszedł do działu IT, wymienili mi dysk, ale ja straciłem wszystkie aliasy.

Stwierdziłem wtedy “Moja wina, bo wszystko, co tylko można, należy trzymać w chmurze”. Więc założyłem repozytorium na githubie cli, gdzie w pliku bash_aliases ponownie zbieram potrzebne mi aliasy. Dodatkowo zrobiłem mały skrypt instalujący, tak by jedną linią

wget https://raw.githubusercontent.com/writeonly/cli/master/bash_aliases_install.sh | bash

móc odzyskać wszystko to, do czego przywykłem.

A komendą:

update_aliases

można zaktualizować aliasy.

Jekyll i ciasteczka (pliki cookies)

Przed założeniem bloga opartego na technologiach Jekyll i GitHub Pages przejrzałem sporo polskojęzycznych blogów z opisem “Jak to zrobić”. Wszyscy mówili, że jest to niesamowicie proste. Za wyjątkiem jednego malkontenta, Gutka (https://blog.gutek.pl/2014/10/30/nowy-blog-2/).

Pierwszy wieczór spędziłem na nieudanej instalacji Jekylla i próbie uruchomienia przykładowego bloga opartego na motywie graficznym BlackDocs (https://github.com/karloespiritu/BlackDoc). Wieczór zakończyłem w momencie przeczytania porady na StackOverflow “usuń Rubiego i zainstaluj wszystko ponownie”. Wtedy stwierdziłem, że może jednak Gutek ma rację i Jekyll bywa problematyczny.

Jednak nie poddałem się i po paru wieczorach miałem pusty blog z możliwością komentowania postów i skryptem raportującym statystyki (funkcjonalność dodana według https://devcave.pl/dajsiepoznac2017/jekyll-disqus-comments-google-analitics) oraz nie do końca skonfigurowaną wyszukiwarką (https://devcave.pl/frontend/wyszukiwarka-na-blogu-bez-backendu). W tym momencie uznałem, że dalsze usprawnianie bloga, który nie zawiera żadnej treści, nie ma żadnego sensu. W związku z czym odłożyłem na czas późniejszy dodawanie tagów i kategorii “bez użycia pluginu” (https://devenv.pl/pierwsze-zetkniecie-jekyll-podzial-kategorie/ i http://www.minddust.com/post/tags-and-categories-on-github-pages/). A nuż w międzyczasie plugin dla kategorii znajdzie się na liście pluginów wspieranych przez GitHub Pages (Aktualna lista wspieranych pluginów https://pages.github.com/versions/).

Po opublikowaniu pierwszego posta czułem jednak, że dalej czegoś brakuje. Wciśnięcie F12 i spojrzenie w kod strony było przerażające. Ujrzałem spaghetti w postaci naprzemiennie występujących fragmentów HTML, CSS i JS. Ale najgorsze było, gdy spojrzałem na zakładkę “Storage”. Okazało się, że moja prosta strona internetowa zapisuje, o zgrozo, ciasteczka. O ile ciasteczko dla systemu komentarzy Disqus można jeszcze obronić, że jest technicznie potrzebne do działania funkcjonalności, o tyle ciasteczko dla Google Analytics jest już jawnym śledzeniem użytkownika!

Poszukiwanie rozwiązania mojego problemu doprowadziło mnie do strony https://jekyllcodex.org/ , a dokładniej do sekcji “Without plugins” (https://jekyllcodex.org/without-plugins/). Znalazłem tam skrypt wyświetlający banner informujący o plikach Cookies. Po moich przeróbkach wygląda on tak:

<style>
    #cookie-notice {padding: 7px 15px; display: none; text-align: center; position: fixed; bottom: 0; width: 100%; background: #222; color: rgba(255,255,255,0.8);}
    #cookie-notice a {cursor: pointer; margin-left: 10px;}
    @media (max-width: 767px) {
        #cookie-notice span {display: block; padding-top: 3px; margin-bottom: 13px;}
        #cookie-notice a {position: relative; bottom: 4px;}
    }
</style>
<div id="cookie-notice">
    <span>
        Blog, o języku programowania Scala, WriteOnly.pl przechowuje pliki cookies (tzw. ciasteczka) w celach statystycznych i funkcjonalnych.
    </span>
    <a id="cookie-notice-accept" class="btn btn-primary btn-sm">Tak wiem i akceptuję.</a>
    <a href="/privacy/" class="btn btn-primary btn-sm">Chcę dowiedzieć się więcej</a>
</div>
<script>
    function createExpires(days) {
        const date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        return "; expires=" + date.toUTCString();
    }
    function createCookie(name,value,days) {
        const expires = days ? createExpires(days) : "";
        document.cookie = name + "=" + value + expires + "; path=/";
    }
    function readCookie(name) {
        const nameEQ = name + "=";
        const ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
            let c = ca[i];
            while (c.charAt(0)==' ') c = c.substring(1,c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
        }
        return null;
    }
    function eraseCookie(name) {
        createCookie(name,"",-1);
    }
    function isTrue(value) {
        return value == 'true'
    }
    const cookieNoticeDismissed = isTrue(readCookie('cookie-notice-dismissed'))
    if(!cookieNoticeDismissed) {
        $('#cookie-notice').show();
    }
    $('#cookie-notice-accept').click(function() {
        createCookie('cookie-notice-dismissed','true',31);
        $('#cookie-notice').hide();
    });
</script>

Czuję, że na stronie https://jekyllcodex.org/ spędzę więcej czasu z czego wynikają dwie smutne informacje:

  • później zacznę pisać o Scali
  • istnieje niebezpieczeństwo, że nauczę się jQuery
Follow