Czy można zdefiniować polecenie w bash?

25

Na przykład, czy mogę ustawić:

gb = cd /media/Dan/evolution

... aby za każdym razem, gdy wykonuję gbbash, mogę cdprzejść do tego konkretnego katalogu?

Znalazłem coś online: aliaspolecenie. Ale wydaje się, że nie może wykonać powyższej pracy.

Czy można to zrobić? W jaki sposób?

Zen
źródło
10
alias gb='cd /media/Dan/evolution'
Nykakin
4
@Zen, zaakceptuj odpowiedź, jeśli problem zostanie rozwiązany. Jest to gest podziękowania użytkownikowi, który pomógł ci w rozwiązaniu problemu :)
Ramesh
2
Uwaga: Chodzi o bash: Linux jest jądrem. Linux jest często niepoprawnie używany w odniesieniu do całego systemu operacyjnego. Może to powodować zamieszanie. Na przykład pytanie „czy mogę to zrobić w Linuksie?” Brzmi, czy możesz to zrobić na jakimś komputerze, a następnie tak. Ponieważ możesz zaimplementować dowolny system operacyjny, który lubisz, używając jądra Linux. Musimy więc wiedzieć, którego używasz Ubuntu Gnu + Linux + prawdopodobnie X11 (jeśli jest na komputerze, tzn. Nie jest serwerem bez wyświetlacza).
ctrl-alt-delor
@richard Dobra uwaga, choć technicznie jest to posixskarga, więc nie tylko bash.
1
@richard Rzeczywiście, to jest problem. Działa, ponieważ ludzie nie mają na myśli Androida i takich smaków, mniej więcej. Nie mówię, że to dobra rzecz, ale tak właśnie jest. Moje polecenie było niejawne, ponieważ komentowałem twoje oświadczenie dotyczące Linuksa. Wyjaśniłem się, ponieważ temat był mylącym terminem. (
Być

Odpowiedzi:

50

po prostu wpisz:

alias gb='cd /media/Dan/evolution'

Aby to ustawienie było trwałe (aby pozostało po ponownym uruchomieniu lub otwarciu innej konsoli), dodaj ten wiersz do pliku ~ / .bashrc (zakładając, że używasz bash jako domyślnej powłoki)

schrobe
źródło
Aby było jeszcze przyjemniej, możesz utworzyć dedykowany plik aliasu dla swoich aliasów, powiedz ~ / .bash_aliases i wywołać go z poziomu pliku ~ / .bashrc w następujący sposób: [-e ~ / .bash_aliases] &&. ~ / .bash_aliases W ten sposób nie „zanieczyszczasz” pliku ~ / .bashrc innymi rzeczami.
GeertVc
39

Alternatywa dla aliasingu

gb() { cd /media/Dan/evolution; }

Definiuje to funkcję powłoki gb, która nie przyjmuje żadnych argumentów i wykonuje cd / media / Dan / evolution. Podobnie jak w przypadku innych sugestii, można to dodać do ~ / .bashrc

użytkownik1207217
źródło
Wadą tego, że polecenie aliasu pokazuje zdefiniowany alias, afaik zdefiniowanie takiej funkcji może spowodować „nieoczekiwane zachowanie”. Głosuję za
tobą dla kompletności
7
Nie całkiem. Możesz po prostu wpisać: deklaruj -f gb, aby zobaczyć, co robi
Paul Calabro
11
Ponadto ta opcja jest bardziej elastyczna, ponieważ umożliwia dodanie niestandardowej logiki do definicji funkcji w celu akceptowania argumentów i robienia wszystkiego, czego potrzebujesz. Aliasy pozwalają tylko na przekazywanie argumentów i wykonywanie predefiniowanych działań .
Paul Calabro
5
@PaulCalabro Nawet lepiej, type gbbędzie działać, jeśli jest to alias lub funkcja.
Sparhawk
POSIXLY: { echo 'true() { : ; }' >./script ; . ./script ; command -V true ; command -V /usr/bin/true ; }- true is a shell function\n/usr/bin/true is /usr/bin/true- \nznaki były dosłownie znakami nowej linii na wyjściu.
mikeserv
11

Jest to możliwe i aliasjest to polecenie, którego szukasz. Na przykład alias ll="ls -l"w bash pozwoli Ci pisać llzamiast ls -l. Uwaga: podczas ustawiania aliasu nie są używane spacje. man aliasmoże być również przydatne.

schaiba
źródło
-3

Alternatywnie można napisać program w języku C, który wywołuje żądane polecenie i zapisać go w katalogu / usr / bin.

#include <stdio.h>
#include <string.h>

int main () {
    char command[50]; //notice you can change this to fit your needs
    int return_val;

    strcpy( command, "echo \"cd /media/Dan/evolution\" | bash -i" );
    return_val = system(command); 

   //this is equivalent to entering the command in a new bash, 
   //which will return and exit

    return return_val;
}

Aby go skompilować, przejdź do katalogu, w którym zapisano źródło (w bash) i uruchom (możesz potrzebować sudo):

 gcc ./gb.c -o /usr/bin/gb

Po dalszych badaniach tutaj zdałem sobie sprawę, że po prostu wrzucenie twojego polecenia system()nie zadziała dla poleceń wbudowanych w bash. Dlatego musisz utworzyć instancję interaktywnej bash i powtórzyć do niej swoje polecenia. Jest to po prostu zbyt skomplikowane i prawdopodobnie bezużyteczne, chyba że chcesz, powiedzmy, skrócić wywołanie skryptu powłoki ( some_scriptzamiast sh ~/radgeRayden/Scripts/some_script).

Odwołanie do funkcji system ()

radgeRayden
źródło
2
Czy rzeczywiście tego próbowałeś? To nie działa
Dennis
1
Z tego samego powodu, sh -c "cd /media/Dan/evolution"który nie działa. Wskazówka: podpowłoka
Cyfrowa trauma,
5
cdPomijając kwestie / subshell, jaka jest korzyść z zawinięcia polecenia powłoki w programie c, kiedy można równie łatwo (lub łatwiej) umieścić to polecenie w skrypcie powłoki?
Digital Trauma
1
Nie jest w tym ekspertem, ale czy nie powinno być coś takiego (mam nadzieję, że coś bardziej przydatnego) w / usr / local / bin?
Joe
2
Nawet jeśli to MOGŁO działać, nie powinno wchodzić do / usr / local / bin, ponieważ jest specyficzne dla jednego użytkownika.
Johan