In Bash, quando alias, quando scrivere e quando scrivere una funzione?


360

Mi ci sono voluti quasi 10 anni di utilizzo di Linux per porre questa domanda. Era tutto prova ed errore e navigazione casuale a tarda notte in Internet.

Ma le persone non dovrebbero aver bisogno di 10 anni per questo. Se avessi appena iniziato con Linux, vorrei sapere: quando alias, quando scrivere e quando scrivere una funzione?

Per quanto riguarda gli alias, uso gli alias per operazioni molto semplici che non accettano argomenti.

alias houston='cd /home/username/.scripts/'

Sembra ovvio. Ma alcune persone lo fanno:

alias command="bash bashscriptname"

(e aggiungilo al .bashrcfile)

C'è una buona ragione per farlo? Ci sto provando molto, ma sinceramente non riesco a pensare a nessuna circostanza in cui vorrei farlo. Quindi, se esiste un caso limite in cui ciò potrebbe fare la differenza, rispondi di seguito.

Perché è lì che vorrei semplicemente inserire qualcosa nel mio PATH e chmod +xquesto, che è un'altra cosa che è arrivata dopo anni di tentativi ed errori su Linux.

Il che mi porta al prossimo argomento. Ad esempio, ho aggiunto una cartella nascosta ( .scripts/) nella home directory al mio PATH semplicemente aggiungendo una riga a my .bashrc( PATH=$PATH:/home/username/.scripts/), quindi qualsiasi cosa eseguibile lì si completerà automaticamente.

Se ne avessi bisogno.

Non ne ho davvero bisogno, però? Lo userei solo per le lingue che non sono la shell, come Python.

Se è la shell, posso semplicemente scrivere una funzione all'interno della stessa .bashrc:

funcname () {
  somecommand -someARGS "$@"
}

Come ho affermato, ho scoperto molto attraverso prove ed errori. E ho visto davvero la bellezza delle funzioni solo quando il mio computer è morto e sono stato costretto a usare i computer delle persone intorno a me quando non li stavano usando.

Invece di spostare un'intera directory di script da un computer all'altro, ho finito per sostituire il mio .bashrc di tutti con il mio, dal momento che non avevano mai nemmeno fatto una singola modifica.

Ma mi sono perso qualcosa?

Quindi, cosa diresti a un utente Linux principiante di quando alias, quando scrivere e quando scrivere una funzione?

Se non è ovvio, suppongo che le persone che risponderanno utilizzeranno tutte e tre le opzioni. Se usi solo alias, o usi solo script, o usi solo funzioni - o se usi solo alias e script o alias e funzioni o script e funzioni - questa domanda non è realmente rivolta a te.


5
possibile duplicato di funzioni bash vs script
Gilles

10
+1 per la dichiarazione esplicita di tutti i sottoinsiemi di {alias, script, function} ai quali questa domanda non punta. +1 per la fede infantile che per te era OK omettere il sottoinsieme null.
Thomas L Holaday,

1
Sebbene la domanda posta specificamente su bash, nota che le vecchie shell Bourne avevano "alias" ma non funzioni. Questo potrebbe fare la differenza se sei preoccupato per la compatibilità.
AndyB,

Se .bashrc è davvero il posto migliore, o almeno un posto solido, per questo? Ci sono molti modi per fare la stessa cosa in Linux, che apprezzo, tuttavia, a parità di condizioni, preferisco fare le cose nel modo più comune.
Kit10

Risposte:


242

Un alias non dovrebbe effettivamente (in generale) fare altro che cambiare le opzioni predefinite di un comando. Non è altro che una semplice sostituzione di testo sul nome del comando. Non può fare nulla con gli argomenti ma passarli al comando che effettivamente esegue. Quindi, se hai semplicemente bisogno di aggiungere un argomento all'inizio di un singolo comando, un alias funzionerà. Esempi comuni sono

# Make ls output in color by default.
alias ls="ls --color=auto"
# make mv ask before overwriting a file by default
alias mv="mv -i"

Una funzione dovrebbe essere usata quando devi fare qualcosa di più complesso di un alias ma che non sarebbe utile da solo. Ad esempio, prendi questa risposta su una domanda che ho posto sulla modifica grepdel comportamento predefinito a seconda che si tratti di una pipeline:

grep() { 
    if [[ -t 1 ]]; then 
        command grep -n "$@"
    else 
        command grep "$@"
    fi
}

È un esempio perfetto di una funzione perché è troppo complesso per un alias (richiede valori predefiniti diversi in base a una condizione), ma non è qualcosa di cui avrai bisogno in uno script non interattivo.

Se ottieni troppe funzioni o funzioni troppo grandi, inseriscile in file separati in una directory nascosta e sorgente nel tuo ~/.bashrc:

if [ -d ~/.bash_functions ]; then
    for file in ~/.bash_functions/*; do
        . "$file"
    done
fi

Una sceneggiatura dovrebbe essere autonoma. Dovrebbe avere valore come qualcosa che può essere riutilizzato o utilizzato per più di uno scopo.


14
È anche importante ricordare che, a meno che non venga fornito con .o source, uno script viene eseguito da un processo bash separato e ha il suo ambiente. Per questo motivo, tutto ciò che modifica l'ambiente di shell (ad es. Funzioni, variabili, ecc.) Non persisterà nell'ambiente di shell da cui si esegue lo script.
Will Vousden,

260

Le altre risposte forniscono alcune linee guida generali morbide basate sul gusto personale, ma ignorano molti fatti pertinenti che si dovrebbero considerare quando si decide tra script, funzioni o alias.

Alias ​​e funzioni ¹

  • L'intero contenuto di alias e funzioni è archiviato nella memoria della shell.
  • Una conseguenza naturale di ciò è che gli alias e le funzioni possono essere utilizzati solo dalla shell corrente e non da altri programmi che è possibile richiamare dalla shell come editor di testo, script o persino istanze figlio della stessa shell.
  • Gli alias e le funzioni vengono eseguiti dalla shell corrente, ovvero vengono eseguiti all'interno e influiscono sull'ambiente corrente della shell. ² Non è necessario alcun processo separato per eseguire un alias o una funzione.

Script

  • Le conchiglie non mantengono gli script in memoria. Invece, gli script vengono letti dai file in cui sono memorizzati ogni volta che sono necessari. Se lo script viene trovato tramite una $PATHricerca, molte shell memorizzano un hash del suo nome percorso in memoria per risparmiare tempo nelle ricerche future $PATH, ma questa è l'estensione dell'impronta di memoria di uno script quando non viene utilizzata.
  • Gli script possono essere invocati in più modi rispetto a funzioni e alias. Possono essere passati come argomento a un interprete, come sh script, o invocati direttamente come eseguibili, nel qual caso l'interprete nella riga shebang (ad es. #!/bin/sh) Viene invocato per eseguirlo. In entrambi i casi, lo script viene eseguito da un processo interprete separato con un proprio ambiente separato da quello della shell, il cui ambiente lo script non può influire in alcun modo. In effetti, la shell dell'interprete non deve nemmeno corrispondere alla shell che invoca. Poiché gli script invocati in questo modo sembrano comportarsi come qualsiasi normale eseguibile, possono essere utilizzati da qualsiasi programma.

    Infine, uno script può essere letto e gestito dalla shell corrente con ., o in alcune conchiglie, source. In questo caso, lo script si comporta in modo molto simile a una funzione che viene letta su richiesta anziché essere costantemente tenuta in memoria.

Applicazione

Alla luce di quanto sopra, possiamo fornire alcune linee guida generali per stabilire se creare qualcosa di uno script o una funzione / alias.

  • Altri programmi oltre alla shell devono essere in grado di usarlo? In tal caso, deve essere una sceneggiatura.

  • Vuoi che sia disponibile solo da una shell interattiva? È comune voler modificare il comportamento predefinito di molti comandi quando eseguito in modo interattivo senza influire su comandi / script esterni. In questo caso, utilizzare un alias / set di funzioni nel file rc "solo modalità interattiva" della shell (per bashquesto è .bashrc).

  • Deve cambiare l'ambiente della shell? Sia una funzione / alias o uno script di provenienza sono possibili scelte.

  • È qualcosa che usi frequentemente? Probabilmente è più efficiente tenerlo in memoria, quindi rendilo una funzione / alias, se possibile.

  • Al contrario, è qualcosa che usi solo raramente? In tal caso, non ha senso avere la memoria del maiale quando non ne hai bisogno, quindi rendilo uno script.


¹ Sebbene funzioni e alias presentino alcune differenze importanti, sono raggruppate perché le funzioni possono fare tutto ciò che possono fare gli alias. Gli alias non possono avere variabili locali né elaborare argomenti, e sono scomodi per qualcosa di più lungo di una riga.

² Ogni processo in esecuzione in un sistema Unix ha un ambiente costituito da un gruppo di variable=valuecoppie che spesso contengono impostazioni di configurazione globali, come LANGper le impostazioni internazionali predefinite e PATHper specificare il percorso di ricerca eseguibile.


26
IMHO Questa è la risposta migliore.
Luc M

4
Il formato domanda / risposta è un'ottima idea. Potrei rubarlo. ;-)
Mikel

4
Vale la pena notare che se due (o più) script devono condividere del codice, probabilmente è meglio mettere quel codice in una funzione che si trova in un terzo file importato / sorgente da entrambi quegli script.
Kbolino,

3
Un altro elemento da aggiungere a quell'elenco di domande: hai mai bisogno di cambiare funzionalità al comando al volo? le modifiche a uno script si rifletteranno in tutte le sessioni, mentre le funzioni e gli alias devono essere ricaricati o ridefiniti in base alla sessione.
Stratus3D

3
Buona risposta. Un'altra cosa importante (per me): quando si crea un "collegamento" ad altri programmi di utilità, è meglio usare un alias perché il completamento automatico esistente funzionerà solo con gli alias, ma non con script o funzioni (quindi +1 per gli alias). ad es. creando un alias g='gradle'completamento automatico graduale quando uso il mio galias, ma non lo avrò pronto all'uso quando utilizzo uno script gradle $*o una funzione congradle $@
Yoav Aharoni

37

Penso che dipenda dai gusti di ogni persona. Per me la logica è questa:

  • Per prima cosa provo a creare un alias, perché è il più semplice.
  • Se la cosa è troppo complicata per rientrare in una riga, provo a renderla una funzione.
  • Quando la funzione inizia a crescere oltre una dozzina di righe, la inserisco in uno script.

Non c'è davvero nulla che ti impedisca di fare qualcosa che funzioni .


6
Salto spesso l'opzione di funzione e faccio subito uno script. Ma sono d'accordo che è in parte una questione di gusti
Bernhard,

2
Una funzione inizia ad avere senso se ne hai bisogno in più script.
Nils,

7
... o se hai bisogno degli effetti collaterali per modificare la shell corrente .
Glenn Jackman,

ha senso, amico!
esploratore

15

Almeno parzialmente è una questione di gusti personali. D'altra parte ci sono alcune distinzioni funzionali chiare:

  • alias: adatto solo per semplici sostituzioni di testo, senza argomenti / parametri
  • funzioni: facile da scrivere / usare, capacità di scripting full shell, disponibile solo in bash
  • script: più o meno come funzioni, ma disponibili (richiamabili) anche al di fuori di bash

Guardando gli script di shell che ho fatto negli ultimi anni ho più o meno smesso di scrivere alias (perché tutti tendono a crescere nel tempo in funzioni) e faccio script solo se devono essere disponibili anche da ambienti non bash.

PS: Per quanto riguarda in alias command="bash bashscriptname"realtà non vedo alcun motivo per farlo. Anche se bashscriptnamenon è in $ PATH, un semplice alias c=/path/to/scriptsarebbe abbastanza.


1
Nello alias command="bash bashscriptname"script non deve necessariamente essere eseguibile; nel alias c=/path/to/scriptdeve.
Martin - マ ー チ ン

Non è affatto vero che le funzioni siano "disponibili solo all'interno di Bash". Se intendi dire che sono solo funzionalità Bash, è semplicemente falso (la shell Bourne e ogni derivata compatibile li hanno); e se intendi dire che sono una caratteristica delle shell interattive, non è neanche accurato (anche se gli alias, le variabili e le funzioni definite in un file che viene caricato all'avvio da shell interattive ovviamente non verranno caricate da shell non interattive).
triplo

@tripleee Il significato era più simile a "non puoi exec()shell funzioni" :-)
nohillside

11

Ecco alcuni punti aggiuntivi su alias e funzioni:

  • Alias ​​e funzione con lo stesso nome possono coesistere
  • lo spazio dei nomi alias viene prima cercato (vedi primo esempio)
  • gli alias non possono essere (annullati) in subshells o ambienti non interattivi (vedi secondo esempio)

Per esempio:

alias f='echo Alias'; f             # prints "Alias"
function f { echo 'Function'; }; f  # prints "Alias"
unalias f; f                        # prints "Function"

Come possiamo vedere, esistono spazi dei nomi separati per alias e funzioni; maggiori dettagli possono essere trovati usando declare -A -p BASH_ALIASESe declare -f f, che stampa le loro definizioni (entrambi sono memorizzati in memoria).

Esempio che mostra le limitazioni degli alias:

alias a='echo Alias'
a        # OK: prints "Alias"
eval a;  # OK: prints "Alias"
( alias a="Nested"; a );  # prints "Alias" (not "Nested")
( unalias a; a );         # prints "Alias"
bash -c "alias aa='Another Alias'; aa"  # ERROR: bash: aa: command not found

Come possiamo vedere gli alias non sono annidabili, a differenza delle funzioni. Inoltre, il loro utilizzo è limitato alle sessioni interattive.

Infine, nota che puoi avere un calcolo arbitrario in un alias dichiarando una funzione che la chiama immediatamente, in questo modo:

alias a_complex_thing='f() { do_stuff_in_function; } f'

che è già ampiamente utilizzato in caso di alias Git. Il vantaggio di farlo oltre a dichiarare una funzione è che il tuo alias non può essere semplicemente sovrascritto dal sorgente (o dall'uso .) di uno script che sembra dichiarare una funzione con lo stesso nome.


10

Quando scrivere una sceneggiatura ...

  • Gli script assemblano componenti software (ovvero strumenti, comandi, processi, eseguibili, programmi) in componenti più complessi, che possono essere assemblati in componenti ancora più complessi.
  • Gli script sono generalmente resi eseguibili in modo che possano essere chiamati per nome. Quando viene chiamato, viene generato un nuovo sottoprocesso per l'esecuzione dello script. Le copie di tutte le exportvariabili e / o funzioni ed vengono passate per valore allo script. Le modifiche a tali variabili non si propagano allo script principale.
  • Gli script possono anche essere caricati (provenienti) come se fossero parte dello script chiamante. Questo è analogo a ciò che alcune altre lingue chiamano "import" o "include". Quando provengono, eseguono all'interno del processo esistente. Non viene generato alcun sottoprocesso.

Quando scrivere una funzione ...

  • Le funzioni sono effettivamente script di shell precaricati. Si comportano in modo leggermente migliore rispetto alla chiamata di uno script separato, ma solo se devono essere letti dal disco meccanico. La proliferazione odierna di unità flash, SSD e la normale memorizzazione nella cache di Linux nella RAM non utilizzata rende tale miglioramento in gran parte non misurabile.
  • Le funzioni servono come mezzo principale di bash per ottenere modularità, incapsulamento e riutilizzo. Migliorano la chiarezza, l'affidabilità e la manutenibilità degli script.
  • Le regole di sintassi per chiamare una funzione sono identiche a quelle per chiamare un eseguibile. Una funzione con lo stesso nome di un eseguibile verrebbe invocata invece dell'eseguibile.
  • Le funzioni sono locali per lo script in cui si trovano.
  • Le funzioni possono essere esportate ( copiate per valore ) in modo che possano essere utilizzate all'interno di script chiamati. Pertanto, le funzioni si propagano solo ai processi figlio, mai ai genitori.
  • Le funzioni creano comandi riutilizzabili che sono spesso assemblati in librerie (uno script con solo definizioni di funzioni) che possono essere acquistati da altri script.

Quando scrivere un alias ...

All'interno di script come gli script di libreria, a volte è necessario un alias per una funzione, ad esempio quando una funzione viene rinominata ma è richiesta la compatibilità con le versioni precedenti. Questo può essere realizzato creando una semplice funzione con il vecchio nome che passa tutti i suoi argomenti alla nuova funzione ...

# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }

9

Un'altra cosa che non credo sia stata sollevata: una funzione viene eseguita nel contesto del processo di invocazione, mentre uno script crea una nuova shell.

Questo potrebbe essere importante per le prestazioni: una funzione è più veloce, poiché non lo è fork()e exec(). In circostanze normali, la differenza è banale, ma se si sta eseguendo il debug di un sistema che ha esaurito la memoria e si sta scaricando la pagina, potrebbe fare una grande differenza.

Inoltre, se si desidera modificare l'ambiente shell corrente, è necessario utilizzare una funzione. Ad esempio, una funzione potrebbe cambiare la ricerca dei comandi $PATHper la shell corrente, ma uno script non può, poiché opera su una copia fork / exec di $PATH.


Come funziona questa propagazione di funzioni ai bambini?
HappyFace,

1
@HappyFace In Bash puoi avere export -funa funzione, anche se i precisi meccanismi interni di questo sono piuttosto oscuri. Credo che questo non sia portatile rispetto alla tradizionale shell Bourne.
Tripleee

7

Script, alias, script e funzione non si escludono a vicenda. È possibile archiviare alias e funzioni negli script.

Gli script sono solo codice reso persistente . Funzioni utili e alias che ti piacerebbe usare in futuro sono memorizzati negli script. Tuttavia, uno script è spesso una raccolta di più di una funzione.

Poiché gli alias non sono parametrizzati , sono molto limitati; di solito per definire alcuni parametri predefiniti.

Una funzione è un'unità di codice separata , un concetto ben definito di poche righe di codice che non possono essere separate in parti più piccole e utili; uno che può essere riutilizzato direttamente o altro da altre funzioni.


5

Se dovrebbe essere molto veloce, rendilo un alias o una funzione.

Se dovrebbe essere utilizzabile al di fuori della tua shell preferita, rendilo uno script. 1

Se accetta argomenti, rendilo una funzione o uno script.

Se deve contenere caratteri speciali, rendilo un alias o uno script. 2

Se deve funzionare con sudo, rendilo un alias o uno script. 3

Se si desidera modificarlo facilmente senza disconnettersi e accedere, uno script è più semplice. 4

Le note

1 Oppure trasformalo in un alias, inseriscilo ~/.enve export ENV="$HOME/.env"impostalo, ma è complicato farlo funzionare in modo portabile.

2 I nomi delle funzioni devono essere identificativi, quindi devono iniziare con una lettera e possono contenere solo lettere, cifre e caratteri di sottolineatura. Ad esempio, ho un alias alias +='pushd +1'. Non può essere una funzione.

3 E aggiungi l'alias alias sudo='sudo '. Idem qualsiasi altro comando, come strace, gdbecc che prende un comando come primo parametro.

4 Vedi anche: fpath. Certo che puoi anche fare source ~/.bashrco simili, ma questo ha spesso altri effetti collaterali.


1
Non sapevo che si potesse alias +in bash. È interessante notare che dopo il test ho scoperto che in bash è possibile creare +un alias ma non una funzione, come dici tu, ma zsh è il contrario - +può essere una funzione ma non un alias.
Kevin,

In zshdevi scrivere alias -- +='some command here'.
Mikel,

In qualche modo, non penso che l'aliasing +sia portatile. Vedi le specifiche POSIX su Alias ​​Names
jw013,

3
Voto per l' sudoutilizzo di copertura . Per quanto riguarda la nota 4, memorizzo i miei alias ~/.bash_aliasese le definizioni delle funzioni in ~/.bash_functionsmodo da poterli riutilizzare facilmente source(senza alcun pericolo di effetti collaterali).
Anthony Geoghegan,

3

Solo per aggiungere alcune note:

  • Con sudo è possibile utilizzare solo script separati (come se fosse necessario modificare un file di sistema), ad esempio:
sudo v /etc/rc.conf  #where v runs vim in a new terminal window;
  • Solo gli alias o le funzioni potrebbero sostituire i comandi di sistema con lo stesso nome (supponendo che tu aggiunga i tuoi script dir alla fine di PATH, che penso sia consigliabile per sicurezza in caso di creazione accidentale o malevola di script con nome identico a un comando di sistema), per esempio:
alias ls='ls --color=auto'  #enable colored output;
  • Gli alias e le funzioni richiedono meno memoria e tempo per l'esecuzione, ma impiegano del tempo per caricarsi (poiché la shell deve interpretarli tutti prima di mostrare il prompt). Tenerne conto se si eseguono regolarmente nuovi processi di shell, ad esempio:
# pressing key to open new terminal
# waiting for a few seconds before shell prompt finally appears.

Oltre a ciò, è possibile utilizzare la forma più semplice possibile, ovvero prima considerare l'alias, quindi la funzione, quindi lo script.


5
Gli alias possono anche essere usati con sudo. Ma prima devi alias sudo='sudo '.
Mikel,

Mentre è vero che l'esecuzione di uno script consumerà momentaneamente più memoria per la durata del fork + exec, avendo un sacco di codice caricato nella memoria dell'istanza di shell corrente lo fa consumare più memoria in futuro, spesso per archiviare codice che solo viene usato abbastanza raramente.
triplo

2

La mia regola empirica è:

  • alias - un comando, nessun parametro
  • funzioni - un comando alcuni parametri
  • script - diversi comandi, nessun parametro

1

In un ambiente multiutente (o multi sysamin), uso gli script per tutto, anche se finisce per essere un breve wrapper "exec qualcosa ....".

Certo, è tecnicamente più lento / meno efficiente di un alias o di una funzione, ma non importa quasi mai - e purché sia ​​nel percorso, uno script funziona sempre.

La tua funzione potrebbe essere chiamata da cron, da qualcosa con un ambiente ridotto o modificato come sudo o env, oppure l'utente potrebbe semplicemente utilizzare una shell diversa per te, tutto o che probabilmente romperà un alias o una funzione.

Se hai qualcosa di sensibile alle prestazioni, gestiscilo come un caso speciale, o meglio ancora, considera che un trigger per riscrivere in un linguaggio di scripting più funzionale.

Se stiamo parlando di funzionalità che verranno utilizzate solo in altri script, allora puoi anche considerare la definizione di una shell standard e la scrittura di uno script della libreria di funzioni che può essere. proveniente da tutti gli altri script.

T


0

Un esempio per una situazione in cui ti piacerebbe molto usare un alias.

So che questo è un vecchio post, ma vorrei sottolineare una situazione in cui ho quasi dovuto usare una combinazione di alias con uno script e ho scelto di non usare una funzione.

Ho una sceneggiatura ~/.bin/chiamata setupche fa quanto segue: 1

  1. mi porta in una determinata directory.
  2. definisce alcune variabili.
  3. stampa i messaggi sullo stato della directory. 2

Il punto è che se avessi appena eseguito setup <project-name>non avrei definito quelle variabili e non sarei arrivato alla directory. La soluzione che ho trovato per essere il migliore è stato quello di aggiungere questo script per PATHe aggiungere alias setup=". ~/.bin/setup"al ~/.bashrco qualsiasi altra cosa.

Appunti:

  1. Ho usato uno script per questa attività e non una funzione non perché è particolarmente lunga ma perché posso modificarlo e non devo eseguire il sorgente del file dopo una modifica se voglio aggiornarne l'utilizzo.
  2. Un caso simile mi è successo quando ho creato una sceneggiatura per ricaricare tutti i miei dotfile. 3
  1. Lo script è disponibile nel mio repository dotfiles in .bin/.
  2. Informazioni sullo script : do a questo script un argomento che è un nome per il progetto che ho definito in anticipo. Successivamente lo script sa portarmi nella directory giusta in base a un determinato csvfile. Le variabili che definisce sono prese dal makefile in quella directory. La sceneggiatura viene eseguita successivamente ls -le git statusper mostrarmi cosa sta succedendo lì.
  3. Questo script è disponibile anche nel mio repository dotfiles anche sotto .bin/.

1
Hm, sembra che dovrebbe essere solo una funzione, non una combinazione di alias-script. (A proposito, ambienti è scritto "ambienti" non "ambienti".)
Wildcard

Grazie per aver commentato l'errore di battitura, lo aggiusterò al prossimo commit. Per quanto riguarda l'utilizzo di una funzione anziché di uno script, forse userò una funzione per questa particolare attività e lascerò cadere questi alias. Il punto è che a volte è abbastanza facile usare uno script e un alias se lo si modifica di volta in volta .
Doron Behar,

0

Quando scrivere una sceneggiatura

Quando si desidera eseguire il comando da uno strumento diverso dalla shell.

Questo include vim (per me): avendo scritto filtri e altri programmi come script, posso fare qualcosa come :%!my-filterfiltrare un file attraverso il programma dal mio editor.

Se my-filterfosse una funzione o un alias, ciò non sarebbe possibile.

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.