Come passare gli argomenti della riga di comando a un alias di shell?


288

Come faccio a passare gli argomenti della riga di comando a un alias? Ecco un esempio:

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

Ma in questo caso $ xx viene tradotto all'alias creando tempo e non in fase di esecuzione. Tuttavia, ho creato una soluzione alternativa usando una funzione shell (dopo aver cercato su Google un po ') come di seguito:

funzione mkcd () {
  mkdir $ 1
  cd $ 1
}

Volevo solo sapere se esiste un modo per creare alias che accettano parametri CL.
A proposito: uso 'bash' come shell predefinita.


2
Possibile duplicato dell'alias Crea un Bash che accetta un parametro?
Tripleee

2
O / T ma circa come alternativa a fare una funzione mkcd, puoi scriveremkdir mydirectoryname && cd $_
moala

Risposte:


174

Hai trovato il modo: crea una funzione anziché un alias. La shell C ha un meccanismo per fare argomenti agli alias, ma bash e la shell Korn no, perché il meccanismo di funzione è più flessibile e offre la stessa capacità.


Tuttavia, non è necessario disporre di funzioni durante la creazione di alias nel .bashrcfile. Ad esempio, # crea un alias che accetta il numero di porta dall'alias dell'utente serve = "python -m SimpleHTTPServer $ 1" Dopo aver apportato la modifica al file .bashrc, assicurati di inserire il seguente comando. ~ $ source .bashrc Dovresti essere in grado di usarlo così ~ $ serve 8998
kaizer1v

8
@ kaizer1v, La mia osservazione su CentOS7.3 bash versione 4.2.46 è che il tuo suggerimento non funziona come pensi. Dato che stai usando virgolette doppie, $ 1 viene effettivamente valutato su una stringa vuota e l'alias è in realtà lo stesso di alias serve = "python -m SimpleHTTPServer" e quindi qualunque cosa passi dopo quell'alias viene ANCHE passato sulla riga di comando. Se provi questo set -x; alias serve = "python -m SimpleHTTPServer $ 1 &" vedrai l'errore / problema. Sia il tuo argomento che il comando alias vengono eseguiti come comandi separati.
PatS,

279

Giusto per ribadire quanto è stato pubblicato per altre shell, in Bash i seguenti lavori:

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

Eseguendo quanto segue:

blah one two

Fornisce l'output seguente:

First: one
Second: two

4
Ottima soluzione Alcune domande da un principiante bash: la funzione deve essere nominata con un trattino basso (o in modo diverso) o è solo per leggibilità? Qual è lo scopo del trailing "; _blah" nel definire la funzione? Perché non funziona quando si usano le virgolette doppie al posto delle virgolette singole ($ 1 non è interpretato correttamente) anche quando si fa qualcosa che non richiede virgolette intorno a $ 1? Grazie in anticipo per il suggerimento. Ho una soluzione funzionante, ma mi piace sempre capire di più sul perché funziona.
mynameispaulie,

4
@mynameispaulie La funzione può essere nominata in qualsiasi modo. Ho usato un prefisso di sottolineatura in quanto è un trucco comune per aiutare a prevenire le collisioni di nomi (ovvero un'altra funzione con lo stesso nome)
Thomas Bratt,

6
@mynameispaulie Le doppie virgolette consentono Bashdi sostituire $1e $2con i parametri passati alla funzione. Le virgolette singole dicono a Bash di non farlo.
Thomas Bratt,

5
Vedo questo alias / funzione combinato copiato / incollato molto, ma non sembra avere alcuno scopo utile. L'approccio standard sarebbe quello di definire la funzione una volta, con un nome sano, e non avere un alias.
Tripleee

16
Non riesco a vedere come si preferisce questofunction blah(){ echo "First: $1"; echo "Second: $2"; }
René Nyffenegger,

57

Non puoi in ksh, ma puoi in csh.

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

In ksh, la funzione è la strada da percorrere. Ma se davvero volessi davvero usare l'alias:

alias mkcd='_(){ mkdir $1; cd $1; }; _'

Come nota a margine interessante, penso che la vulnerabilità legata all'esecuzione di codice in modalità remota di cui tutti hanno parlato recentemente implichi quasi esattamente la stessa cosa, ma in una variabile di ambiente impostata da un input utente non elaborato. openwall.com/lists/oss-security/2014/09/24/11
Floegipoky

@Floegipoky - Perché è in un alias e non in un ambiente, è sostanzialmente diverso. Il problema di ShellShock è che viene eseguito quando viene impostato env var. L'impostazione di un ambiente var dovrebbe essere un'operazione sicura. Nessuno script viene eseguito quando viene impostato l'alias sopra, solo quando viene eseguito l'alias.
Sanjaya R,

Forse dovrebbe essere sottolineato che di cshsolito non è ciò che una persona moderna dovrebbe voler usare. L'alias-che-crea-una-funzione-quindi-esegue-quella-funzione è relativamente popolare, ma non offre alcun vantaggio rispetto a una funzione adeguata per quanto ne so. (La funzione dovrebbe comunque citare correttamente il suo argomento.) Downvoting.
Tripleee,

17

Per citare la pagina man di bash:

Non esiste alcun meccanismo per l'utilizzo degli argomenti nel testo sostitutivo. Se sono necessari argomenti, è necessario utilizzare una funzione shell (vedere FUNZIONI di seguito).

Quindi sembra che tu abbia risposto alla tua domanda: usa una funzione anziché un alias



5

Ho scoperto che le funzioni non possono essere scritte nel ~/.cshrcfile. Qui in alias che accetta argomenti

ad esempio, argomenti passati al comando 'trova'

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

dove abc è l'argomento passato come!: 1


4
Questo non è utile per l'OP, la cui shell predefinita è bash. E la risposta di Sanjaya R menzionava alias csh 4 anni fa.
Keith Thompson,

1
La risposta di Sanjaya R non ha spiegato cosa !:1significasse. Ho dovuto scorrere verso il basso per vedere qui che era l'argomento. Una buona risposta non lascia più domande, anche se non fosse per il tipo di shell degli OP.
searchengine27,

4

Il modo più semplice è utilizzare la funzione e non l'alias. puoi comunque chiamare una funzione in qualsiasi momento dal cli. In bash, puoi semplicemente aggiungere il nome della funzione () {comando} che carica lo stesso di un alias.

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

Non sono sicuro di altre conchiglie



1

Questo funziona in ksh:

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

L'opzione "-x" rende l'alias "esportato" - l'alias è visibile nei subshells.

E sii consapevole del fatto che gli alias definiti in uno script non sono visibili in quello script (perché gli alias vengono espansi quando viene caricato uno script, non quando viene interpretata una riga). Questo può essere risolto eseguendo un altro file di script nella stessa shell (usando il punto).



-2

Ecco una semplice funzione di esempio che usa python. Puoi rimanere in ~ / .bashrc
Devi avere uno spazio dopo la prima parentesi graffa sinistra
Il comando python deve essere tra virgolette doppie per ottenere la sostituzione delle variabili
Non dimenticare quel punto e virgola alla fine

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

$ count 6
0
1
2
3
4
5
$

-5

Un alias vuoto eseguirà i suoi arg:

alias DEBUG=

12
Vedo dal tuo rappresentante che sei nuovo di SO (StackTranslate.it). Per favore, non scoraggiarti votando verso il basso della tua risposta. È stato votato perché non risponde alla domanda a cui l'OP (Poster originale) ha chiesto di aver risposto. Aspetta e continua a provare. Inoltre, quando rispondi, prova a includere un semplice esempio di come funziona la tua risposta e mostra l'output. Questo aiuterà gli altri a vedere come funziona la tua risposta.
PatS,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.