2010-10-30 21 views
84

Ist es möglich, folgendes zu tun:Passing Argument alias in bash

Ich will laufen die folgenden:

mongodb bin/mongod 

In meinem bash_profile Ich habe

alias = "./path/to/mongodb/$1" 

Antwort

171

Ein Alias ​​wird zu der Zeichenfolge erweitert, die es darstellt. Alles nach dem Alias ​​erscheint nach seiner Erweiterung, ohne dass es als explizite Argumente übergeben oder übergeben werden kann (z. B. $1).

$ alias foo='/path/to/bar' 
$ foo some args 

wird

$ /path/to/bar some args 

Wenn Sie explizite Argumente bekommen erweitert verwenden möchten Sie wird verwenden müssen, eine Funktion

$ foo() { /path/to/bar "[email protected]" fixed args; } 
$ foo abc 123 

ausgeführt, als ob Sie

getan hatte
$ /path/to/bar abc 123 fixed args 

Undefiniert ein alias:

unalias foo 

eine Funktion undefine:

unset -f foo 

die Art und Definition siehe (für jeden definierten alias, Stichwort, Funktion, eingebaute oder eine ausführbare Datei):

type -a foo 

Oder nur eingeben (für die höchste Präzedenz):

type -t foo 
+7

Ich möchte nur ein Beispiel aus meiner .bashrc hinzufügen mkcd() {mkdir "$ @" && cd "$ @"; } wo ich Dir und cd'ing in –

+0

erstellen Sie sollten "abc" rot auch seit $ @ = Liste der Argumente an die Funktion übergeben. – 10basetom

+3

@ 10basetom: Wenn Sie sich auf die Farben in meiner Antwort beziehen, geschieht dies automatisch durch den Syntax-Highlighter. –

16

Normalerweise, wenn ich Will ich Argumente an einen Alias ​​in Bash übergeben, verwende ich eine Kombination aus einem Alias ​​und einer Funktion wie dieser, zum Beispiel:

function __t2d {                 
     if [ "$1x" != 'x' ]; then            
      date -d "@$1"              
     fi                  
} 

alias t2d='__t2d'                
+1

Was ist das immer falsche 'if'-Anweisung für? –

+0

behoben. Es war ein Tippfehler, Entschuldigung. es war wirklich gedacht, um die Existenz von $ 1 – leed25d

+16

'[-n" $ 1 "]' (die Verwendung von "x" auf diese Weise ist archaisch und unnötig für jede moderne Shell) zu überprüfen –

-3

Um die Antwort von leed25d zu vereinfachen, verwenden Sie eine Kombination aus einem Alias ​​und einer Funktion. Zum Beispiel:

function __GetIt { 
    cp ./path/to/stuff/$* . 
} 

alias GetIt='__GetIt' 
14

Parameter in Aliasnamen zu verwenden, ich benutze diese Methode:

alias myalias='function __myalias() { echo "Hello $*"; unset -f __myalias; }; __myalias' 

seine eine selbstzerstörerische Funktion in einem Alias ​​eingewickelt, so dass es ziemlich das Beste aus beiden Welten, und nimmt keine zusätzlichen Zeilen in deinen Definitionen auf ... was ich hasse, oh ja, und wenn du diesen Rückgabewert brauchst, musst du ihn vor dem Aufruf von unset speichern und dann den Wert mit "return" zurückgeben "Stichwort in dieser selbstzerstörerischen Funktion dort:

alias myalias='function __myalias() { echo "Hello $*"; myresult=$?; unset -f __myalias; return $myresult; }; __myalias' 

so ..

Sie könnten, wenn Sie dort diese Variable haben in

alias mongodb='function __mongodb() { ./path/to/mongodb/$1; unset -f __mongodb; }; __mongodb' 

natürlich ...

alias mongodb='./path/to/mongodb/' 

tun würde tatsächlich die gleiche Sache, ohne die Notwendigkeit für Parameter, aber wie ich schon sagte, wenn man wollte oder brauchte sie aus irgendeinem Grund (zum Beispiel benötigt man 2 $ statt $ 1), würden Sie verwenden müssen so ein Wrapper. Wenn es größer als eine Zeile ist, könnte man überlegen, einfach eine Funktion zu schreiben, da es mehr und mehr zu einem Schandfleck wird, wenn es größer wird. Funktionen sind großartig, da Sie alle Vergünstigungen erhalten, die Funktionen geben (siehe Vervollständigung, Traps, Bindung usw. für die Goodies, die Funktionen zur Verfügung stellen können, in der Bash-Manpage).

Ich hoffe, dass hilft Ihnen aus :)

+2

~ $ alias myalias = 'Funktion __myalias() {echo "Hallo $ *"; unset -f __myalias; } __myalias ' ~ $ myalias -bash: Syntaxfehler in der Nähe von unerwarteten Token '__myalias' – JeeBee

+0

Das ist schrecklich! Sie definieren die Funktion jedes Mal neu? (Ich kann nicht einmal prüfen, ob Sie dort Syntaxfehler haben). –

+0

Es ist nicht so, als müssten sie es genau so machen, es sollte ein Beispiel sein, und ja es wird jedes Mal neu definiert, was es auf einer Linie hält, sonst wäre es kein One-Shot wäre es ? Das ist so, als würde man sich darüber beschweren, dass "Alias" sich jedes Mal auf seinen zugewiesenen Inhalt ausdehnt. Wie ist das anders? Und es ist nicht nötig so emotional zu werden. – osirisgothra

3

In csh (im Gegensatz zu bash Gegensatz) können Sie genau das tun, was Sie wollen.

alias print 'lpr \!^ -Pps5' 
print memo.txt 

Die Notation \!^ bewirkt das Argument an diesem Punkt in dem Befehl eingefügt werden.

Dem Zeichen ! ist ein \ vorangestellt, um zu verhindern, dass es als Protokollbefehl interpretiert wird.

Sie können auch mehrere Argumente übergeben:

alias print 'lpr \!* -Pps5' 
print part1.ps glossary.ps figure.ps 

(Beispiele aus http://unixhelp.ed.ac.uk/shell/alias_csh2.1.html entnommen.)

+0

Danke! Ich benutze 'csh' bei der Arbeit und das ist das erste Mal, dass ich es geschätzt habe! –

5

Dies ist die Lösung, die mit der Funktion vermeiden:

alias addone='{ num=$(cat -); echo "input: $num"; echo "result:$(($num+1))"; }<<<' 

Testergebnis

addone 200 
input: 200 
result:201 
+0

Es funktionierte perfekt für mich. Ich wollte die Farbnummer (von 31 bis 37) an PS-Befehl in meinem Alias ​​übergeben. Ich habe so etwas getan: alias psany = '{PS1 = "\ e [0; $ (cat -) m> \ e [m";} <<<' VERWENDUNG: psany 32 – zviad