Jak przekazać argumenty wiersza poleceń do aliasu powłoki?

288

Jak przekazać argumenty wiersza polecenia do aliasu? Oto próbka:

alias mkcd = 'mkdir 1 $; cd $ 1; '

Ale w tym przypadku $ xx jest tłumaczony w aliasie tworzącym czas, a nie w czasie wykonywania. Jednak stworzyłem obejście za pomocą funkcji powłoki (po trochę googlowaniu), jak poniżej:

funkcja mkcd () {
  mkdir 1 $
  cd 1 USD
}

Chciałem tylko wiedzieć, czy istnieje sposób na utworzenie aliasów, które akceptują parametry CL.
BTW - Używam „bash” jako mojej domyślnej powłoki.

Vini
źródło
2
O / T, ale jako alternatywa dla wykonywania funkcji mkcd, możesz napisaćmkdir mydirectoryname && cd $_
moala

Odpowiedzi:

174

Znalazłeś sposób: utwórz funkcję zamiast aliasu. Powłoka C ma mechanizm wykonywania argumentów dla aliasów, ale bash i powłoka Korna nie, ponieważ mechanizm funkcji jest bardziej elastyczny i oferuje tę samą możliwość.

Charlie Martin
źródło
Jednak nie potrzebujesz funkcji podczas tworzenia aliasów w .bashrcpliku. Na przykład # utwórz alias, który pobiera numer portu przez alias użytkownika serve = "python -m SimpleHTTPServer $ 1" Po wprowadzeniu zmian w pliku .bashrc, upewnij się, że wprowadziłeś następujące polecenie. ~ $ source .bashrc Powinieneś być w stanie używać tego w ten sposób ~ $ służyć
8998
8
@ kaizer1v, Moja obserwacja na temat wersji bash CentOS7.3 4.2.46 jest taka, że ​​twoja sugestia nie działa tak, jak myślisz. Ponieważ używasz podwójnych cudzysłowów, $ 1 jest w rzeczywistości obliczany na pusty ciąg, a alias jest w rzeczywistości taki sam, jak alias serve = "python -m SimpleHTTPServer", a więc cokolwiek przekażesz po tym aliasie, jest również przekazywane w wierszu poleceń. Jeśli spróbujesz tego zestawu -x; alias serve = "python -m SimpleHTTPServer $ 1 &" zobaczysz błąd / problem. Zarówno argument, jak i polecenie aliasu są uruchamiane jako osobne polecenia.
PatS
279

Aby powtórzyć to, co zostało opublikowane dla innych powłok, w Bash następujące prace:

alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'

Uruchamianie następujących czynności:

blah one two

Podaje wynik poniżej:

First: one
Second: two
Thomas Bratt
źródło
4
Świetne rozwiązanie. Kilka pytań od nowicjusza: Czy funkcja musi być nazwana znakiem podkreślenia (lub w ogóle inaczej), czy jest to tylko dla czytelności? Jaki jest cel końcowego „; _blah” w definiowaniu funkcji? Dlaczego to nie działa, gdy używasz podwójnych cudzysłowów zamiast pojedynczych cudzysłowów (1 $ nie jest poprawnie interpretowany), nawet gdy robisz coś, co nie wymaga cudzysłowów wokół 1 $? Z góry dziękuję za radę. Mam działające rozwiązanie, ale zawsze lubię rozumieć, dlaczego to działa.
mynameispaulie
4
@ moja nazwaispaulie Funkcja może mieć dowolną nazwę. Użyłem prefiksu podkreślenia, ponieważ jest to powszechna sztuczka, która pomaga zapobiegać kolizjom nazw (tj. Innej funkcji o tej samej nazwie)
Thomas Bratt,
6
@ moja nazwaispaulie Podwójne cudzysłowy pozwalają Bashna zastąpienie $1i $2przekazanie parametrów do funkcji. Pojedyncze cytaty mówią Bashowi, żeby tego nie robił.
Thomas Bratt
5
Widzę, że ten zestaw / alias / funkcja jest często kopiowany / wklejany, ale wydaje się, że nie ma on żadnego użytecznego celu. Standardowe podejście polegałoby na jednokrotnym zdefiniowaniu funkcji za pomocą zdrowego imienia i braku aliasu.
tripleee
16
Nie rozumiem, jak to jest preferowanefunction blah(){ echo "First: $1"; echo "Second: $2"; }
René Nyffenegger
57

Nie możesz w ksh, ale możesz w csh.

alias mkcd 'mkdir \!^; cd \!^1'

W ksh funkcja jest właściwą drogą. Ale jeśli naprawdę chcesz użyć aliasu:

alias mkcd='_(){ mkdir $1; cd $1; }; _'
Sanjaya R.
źródło
Co ciekawe, uważam, że podatność na zdalne wykonanie kodu, o której wszyscy mówili ostatnio, polega na robieniu prawie dokładnie tego samego, ale w zmiennej środowiskowej ustawianej przez surowe dane wejściowe użytkownika. openwall.com/lists/oss-security/2014/09/24/11
Floegipoky
@Floegipoky - Ponieważ jest w aliasie, a nie env var, jest zasadniczo inny. Problem ShellShock polega na tym, że działa on, gdy ustawiona jest zmienna env var. Ustawienie env var powinno być bezpieczną operacją. Żaden skrypt nie jest wykonywany, gdy ustawiony jest powyższy alias, tylko po uruchomieniu aliasu.
Sanjaya R
Być może należy zauważyć, że cshwspółczesna osoba zwykle nie chce tego używać. Alias-który-tworzy-funkcję-następnie-wykonuje-tę-funkcję, jest stosunkowo popularny, ale o ile wiem, nie oferuje żadnych korzyści w porównaniu z właściwą funkcją. (W każdym razie funkcja powinna poprawnie zacytować swój argument.) Downvoting.
tripleee
17

Aby zacytować stronę podręcznika bash:

Nie ma mechanizmu używania argumentów w tekście zastępczym. Jeśli potrzebne są argumenty, należy użyć funkcji powłoki (patrz FUNKCJE poniżej).

Wygląda na to, że odpowiedziałeś na własne pytanie - użyj funkcji zamiast aliasu

Chris Dodd
źródło
12

Przydatne może być również to polecenie:

mkdir dirname && cd $_

gdzie dirname to nazwa katalogu, który chcesz utworzyć

tdecs
źródło
1
@StarDust $_jest wyjściem ostatniego polecenia unix.stackexchange.com/a/271693/169772
Taylor Edmiston
5

Odkryłem, że funkcji nie można zapisać w ~/.cshrcpliku. Tutaj w aliasie, który przyjmuje argumenty

na przykład argumenty przekazane do polecenia „znajdź”

alias fl "find . -name '\!:1'"     
Ex: >fl abc

gdzie abc jest argumentem przekazywanym jako!: 1

Kumar Palaniappan
źródło
4
Nie jest to przydatne dla OP, którego domyślną powłoką jest bash. I odpowiedź Sanjaya R wspomniała o aliasach csh 4 lata temu.
Keith Thompson,
1
Odpowiedź Sanjaya R nie wyjaśniła, co to !:1znaczy. Musiałem przewinąć w dół, aby zobaczyć, że to był argument. Dobra odpowiedź nie pozostawia więcej pytań, nawet jeśli nie dotyczy to typu powłoki PO.
searchengine27
4

Najprostszym sposobem jest użycie funkcji, a nie aliasu. nadal możesz wywołać funkcję w dowolnym momencie z cli. W bash możesz po prostu dodać funkcję name () {polecenie}, ładuje się tak samo jak alias.

function mkcd() { mkdir $1; cd $1 ;}

Nie jestem pewien co do innych powłok

Luke Attard
źródło
1

Działa to w ksh:

$ alias -x mkcd="mkdir \$dirname; cd \$dirname;"
$ alias mkcd
mkcd='mkdir $dirname; cd $dirname;'
$ dirname=aaa 
$ pwd
/tmp   
$ mkcd
$ pwd
/tmp/aaa

Opcja „-x” powoduje, że alias jest „eksportowany” - alias jest widoczny w podpowłokach.

I pamiętaj, że aliasy zdefiniowane w skrypcie nie są widoczne w tym skrypcie (ponieważ aliasy są rozwijane po załadowaniu skryptu, a nie podczas interpretacji wiersza). Można to rozwiązać poprzez wykonanie innego pliku skryptu w tej samej powłoce (za pomocą kropki).


źródło
-2

Oto prosta przykładowa funkcja wykorzystująca Python. Możesz wstawić ~ / .bashrc
Po pierwszej lewej nawiasach klamrowych musisz wstawić spację
Aby uzyskać podstawienie zmiennej, musisz wprowadzić podwójny cudzysłów Python
Nie zapomnij o tym średniku na końcu

function count () {python -c "for num in xrange ($ 1): print num";}

$ count 6
0
1
2
3
4
5
$
AAAfarmclub
źródło
-5

Pusty alias wykona swoje argumenty:

alias DEBUG=
Peter Sharp
źródło
12
Widzę, że jesteś nowy w SO (przepełnienie stosu). Nie wahaj się, głosując za odpowiedzią. Zostało ono odrzucone, ponieważ tak naprawdę nie odpowiada na pytanie, na które OP (oryginalny plakat) poprosił o odpowiedź. Zawieś ich i próbuj dalej. Również podczas odpowiadania postaraj się podać prosty przykład tego, jak działa twoja odpowiedź, i pokaż wynik. Pomoże to innym zobaczyć, jak działa twoja odpowiedź.
PatS