Pagina 1 di 1

[RISOLTO] come creare un "alias" con variabili in ingresso

Inviato: domenica 31 maggio 2015, 18:26
da astrifiammante
Salve a tutti. Sono uno studente di fisica, sono un principiante della programmazione e dovrò fare abbondante uso di Linux e c++. Mi sono iscritto al forum perché mi piacerebbe destreggiarmi con Linux. Spero con il vostro aiuto di imparare tanti trucchetti. Ho subito una domanda da porvi. E' possibile con particolari funzioni degli script della bash shell creare una sorta di alias che riceva delle variabili? Ciò che vorrei fare è riunire il comando g++ -o pippo pippo.cpp in un unico comando

ccg pippo.cpp

che mi dia l'eseguibile di nome ./pippo (e se magari esiste il modo anche di eliminare i caratteri ./). Il ccg è il nome che ho dato io all'ipotetico "alias" che riceve in ingresso come variabile il nome del file sorgente.

Re: come creare un "alias" con variabili in ingresso

Inviato: domenica 31 maggio 2015, 18:47
da Mdfalcubo
Sposto in programmazione.

Re: come creare un "alias" con variabili in ingresso

Inviato: domenica 31 maggio 2015, 18:52
da ubuntumate
Nel terminale digita

Codice: Seleziona tutto

man alias
per avere una spiegazione approfondita del comando.
Per usare un alias:

Codice: Seleziona tutto

alias [comando da accorciare] [alias]
Nota che gli alias sono temporanei e si perdono a fine sessione.Per renderli permanenti devi modificare bashrc.

Re: come creare un "alias" con variabili in ingresso

Inviato: domenica 31 maggio 2015, 20:45
da 1001001
In realtà un alias non è lo strumento giusto per questo tipo di lavoro, perché agli alias non puoi passare variabili in ingresso. Devi fare una function.
La versione più becera possibile è questa:

Codice: Seleziona tutto

function ccg () 
{
    g++ "$1" -o $(basename "$1" .cpp) 
}
Sottolineo nuovamente che è una versione becera, è proprio quella a minimo sforzo possibile, ma è giusto per dare un'idea.
Come ha detto giustamente ubuntumate per gli alias, anche le funzioni vengono perse quando si chiude la sessione di terminale, a meno che non siano inserite ad esempio in ~/.bashrc.

PS:
ubuntumate ha scritto:Nel terminale digita

Codice: Seleziona tutto

man alias
per avere una spiegazione approfondita del comando.
.
Giusto ricordare di usare il manuale, ma in questo caso il comando da dare è

Codice: Seleziona tutto

help alias

:)

Re: come creare un "alias" con variabili in ingresso

Inviato: domenica 31 maggio 2015, 21:34
da vaeVictis
La risposta alla domanda è già contenuta nella messaggio di 1001001 qui sopra.

Dal momento che dichiari espressamente di voler imparare tanti trucchetti
Spero con il vostro aiuto di imparare tanti trucchetti.
ti indico l'esistenza della funzione ricerca. Questa domanda che fai è stata posta già (minimo) un paio di volte e potevi trovare traccia delle discussioni che ne parlano facendo una ricerca avanzata.
In alto a destra trovi la voce "ricerca avanzata". Nella finestra che si apre, puoi personalizzare la ricerca.
Con le parole "alias parametri" e restringendo la ricerca a questa sezione di programmazione, i primi due risultati erano le discussioni che ti servivano :)
In generale, usala quando ti viene una curiosità, perché trovi praticamente l'universo intero (per non parlare della ricerca con Google, se individui quali sono i forum o quello che sia che trattano argomenti di programmazione in modo molto tecnico e approfondito)

:ciao:

Re: come creare un "alias" con variabili in ingresso

Inviato: lunedì 1 giugno 2015, 7:20
da astrifiammante
Vi ringrazio per le risposte. Scusate se non ho effettuato un ricerca approfondita, sono nuovo del forum. Avevo scritto questo messaggio proprio perché sapevo che non era possibile creare un alias con argomenti. Per questo l'avevo virgolettato, per sapere se c'era un modo per creare un analogo con argomenti. Provo subito la function che mi avete indicato. Grazie ancora. :ciao:

Re: come creare un "alias" con variabili in ingresso

Inviato: lunedì 1 giugno 2015, 17:02
da astrifiammante
1001001, scusa se ti disturbo ancora: sono alle prime armi e avrei bisogno di un'altra informazione inerente alla risposta che mi avevi dato qui. Ho provato a scrivere tale funzione dal prompt di shell e l'ho lanciata dalla cartella in cui si trova la funzione ed il file sorgente pippo.cpp che voglio compilare, ma quando lancio la funzione con ccg pippo.cpp mi da il messaggio basenamepippo.cpp.cpp:comando non trovato. (mi ripete fra l'altro l'estensione cpp due volte?). In oltre il compilatore c++ mi da errore nella lista di ingresso del nome file.cpp e del nome che ho scelto per l'eseguibile. Su internet non ho trovato una documentazione specifica (molto probabilmente cerco male io). Ho visto che in un programma di script bash fanno così per ottenere il nomebase del file e la sua estensione:

filename=${file##*/}
basename=${filename%\.*}
extension=${filename##*.}

dove nella variabile file c'è il nome del file (ti posto il sito:https://piccimario.wordpress.com/2011/0 ... a-un-path/). Dunque un modo potrebbe essere:

function ccg()
{
g++ -o ${$1%\.*} $1
}

dove nel primo argomento del comando g++ -o dovrebbe esserci il nome che voglio dare all'eseguibile (dovrebbe essere in base alle dritte del sito che ti avevo segnalato quello che finisce nella variabile basename visto che in $1, il primo argomento che si passa alla funzione, finisce il nome del file sorgente). Mentre $1 è il secondo argomento ovvero il nome del file sorgente che vado a compilare. Purtroppo non mi funziona neanche così mi da:

bash: ${$1%\.*} : sostituzione errata.

Re: come creare un "alias" con variabili in ingresso

Inviato: lunedì 1 giugno 2015, 19:20
da 1001001
[
Un paio di dettagli tecnici prima di rispondere alla domanda, visto che sei nuovo del forum :)
- se devi modificare un messaggio, usa il tasto "modifica" in alto a destra, non farne uno nuovo, altrimenti le discussioni diventano lunghissime e illeggibili
- per massimizzare la probabilità di trovare il problema in tempi rapidi, riporta il messaggio di errore esattamente, non parafrasarlo (mi riferisco a:
astrifiammante ha scritto:Inoltre il compilatore c++ mi da errore nella lista di ingresso del nome file.cpp e del nome che ho scelto per l'eseguibile.
- quando inserisci del codice (o l'output di qualcosa), usa il tasto "Codice" che c'è nella barra degli strumenti sopra la casella di testo di composizione del messaggio, sempre per questioni di leggibilità
]

Detto questo,
astrifiammante ha scritto:quando lancio la funzione con ccg pippo.cpp mi da il messaggio basenamepippo.cpp.cpp:comando non trovato. (mi ripete fra l'altro l'estensione cpp due volte?)
Devi aver perso gli spazi tra basename e "$1" e tra "$1" e .cpp quando hai scritto il comando.
Copia e incolla la riga qua sotto nel terminale:

Codice: Seleziona tutto

function ccg () { g++ "$1" -o $(basename "$1" .cpp); }
e riprova

Re: come creare un "alias" con variabili in ingresso

Inviato: martedì 2 giugno 2015, 1:31
da astrifiammante
grazie 1001001 funziona. Due chiarimenti ancora se non chiedo troppo:
1)Per lanciare l'eseguibile il suo nome va preceduto dai caratteri ./ . Se non chiedo troppo esiste un metodo per poterli non digitare?
2)Quando si compila con l'opzione -o entrambi gli argomenti (i nomi dell'eseguibile e del sorgente) vanno a destra di -o. Nella function ne hai messo uno a sinistra e uno a destra. In $1 va il nome del file sorgente (cioè basename.estensione), perché a destra di -o hai messo basename "$1" .cpp?

Re: come creare un "alias" con variabili in ingresso

Inviato: martedì 2 giugno 2015, 2:23
da vaeVictis
Piccolo intervento a margine: non chiedi troppo. Questo è un forum di supporto, funziona proprio che gli utenti chiedono e gli utenti rispondono :)
(non per parlare a nome di 1001001, ma proprio perché è così).
A fine discussione, me la rileggo e aggiungo un paio di "cose", se non ne avrete già parlato :)

:ciao:

Re: come creare un "alias" con variabili in ingresso

Inviato: martedì 2 giugno 2015, 6:57
da tokijin
@astrifiammante
per favore quando devi postare codici o listati in generale, utilizza il tag Codice:
nella risposta premi il bottone Codice e dentro i tag [ code] e [ /code] ci scrivi il tuo codice ;)

Ciao :ciao:

Re: come creare un "alias" con variabili in ingresso

Inviato: martedì 2 giugno 2015, 10:02
da astrifiammante
Ok la domanda 2 l'ho risolta banalmente, perché sono accettate entrambe le possibilità:

Codice: Seleziona tutto

g++ nomefilesorgente.cpp -o nomefileeseguibile

Codice: Seleziona tutto

g++ -o nomefileeseguibile nomefilesorgente.cpp
La 1 si tratta di non specificare al momento del lancio il path in cui si trova l'eseguibile (visto che ./ indica che si trova nella directory corrente). Nel sito: http://wwwcdf.pd.infn.it/AppuntiLinux/f ... uibili.htm spiega come fare (paragrafo 35.1avvio di un programma e variabile di ambiente "path") per poter modificare il contenuto della variabile "path". Ulteriore domanda a questo punto, posso evitare di scrivere il path (ergo i caratteri ./ che è ciò che mi interessa all'atto della compilazione di un file cpp) soltanto per gli eseguibili prodotti da g++? Nel senso che la non specificazione mi occorre soltanto per gli eseguibili di g++ e voglio lasciare il path per gli altri comandi. C'è soltanto la via della modifica della variabile path?

Re: come creare un "alias" con variabili in ingresso

Inviato: martedì 2 giugno 2015, 14:46
da 1001001
astrifiammante [url=http://forum.ubuntu-it.org/viewtopic.php?p=4764663#p4764663][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:2)Quando si compila con l'opzione -o entrambi gli argomenti (i nomi dell'eseguibile e del sorgente) vanno a destra di -o. Nella function ne hai messo uno a sinistra e uno a destra. In $1 va il nome del file sorgente (cioè basename.estensione), perché a destra di -o hai messo basename "$1" .cpp?
astrifiammante ha scritto:Ok la domanda 2 l'ho risolta banalmente, perché sono accettate entrambe le possibilità:

Codice: Seleziona tutto

g++ nomefilesorgente.cpp -o nomefileeseguibile

Codice: Seleziona tutto

g++ -o nomefileeseguibile nomefilesorgente.cpp
Esatto, sono accettate entrambe le possibilità, perché gli argomenti in ingresso a g++ e a molti altri comandi da shell (vorrei dire tutti, ma sono sicuro che poi ci sarebbe l'eccezione che adesso non mi viene in mente) non hanno un ordine prestabilito (ma nota che con "argomenti in ingresso" intendo la coppia -<opzione> <valore> se l'opzione richiede un valore: cioè, dopo -o devi mettere per forza il nome di output, ma puoi mettere -o nome e file_in_ingresso nell'ordine che vuoi).

astrifiammante ha scritto: 1)Per lanciare l'eseguibile il suo nome va preceduto dai caratteri ./ . Se non chiedo troppo esiste un metodo per poterli non digitare?
astrifiammante ha scritto:La 1 si tratta di non specificare al momento del lancio il path in cui si trova l'eseguibile (visto che ./ indica che si trova nella directory corrente). Nel sito: http://wwwcdf.pd.infn.it/AppuntiLinux/f ... uibili.htm spiega come fare (paragrafo 35.1avvio di un programma e variabile di ambiente "path") per poter modificare il contenuto della variabile "path". Ulteriore domanda a questo punto, posso evitare di scrivere il path (ergo i caratteri ./ che è ciò che mi interessa all'atto della compilazione di un file cpp) soltanto per gli eseguibili prodotti da g++? Nel senso che la non specificazione mi occorre soltanto per gli eseguibili di g++ e voglio lasciare il path per gli altri comandi. C'è soltanto la via della modifica della variabile path?
Sì, c'è solo la via della modifica di PATH. Un eseguibile è un eseguibile, non puoi differenziare il modo in cui l'eseguibile viene cercato in base a chi l'ha creato.
Puoi però aggirare (in un certo senso) questa cosa creando una cartella (tipo ~/c++_exe_files/) che aggiungi poi al PATH e che usi nella function di sopra:

Codice: Seleziona tutto

function ccg () { g++ "$1" -o ~/c++_exe_files/"$(basename "$1" .cpp)"; }
In questo modo tutti gli eseguibili che crei vengono salvati in ~/c++_exe_files/ e possono quindi essere lanciati usando solo il loro nome, visto che ~/c++_exe_files/ è in PATH. Occhio però che così facendo compilando file diversi con nomi uguali (ad esempio, io i miei file li chiamo tutti main.cpp e li distinguo in base alla cartella in cui sono) gli eseguibili in ~/c++_exe_files/ vengono sovrascritti

Re: come creare un "alias" con variabili in ingresso

Inviato: martedì 2 giugno 2015, 15:42
da astrifiammante
Ok recepito. Ringrazio tutti per le dritte :birra:

Re: come creare un "alias" con variabili in ingresso

Inviato: martedì 2 giugno 2015, 17:07
da astrifiammante
ah! dimenticavo. mi avete detto che per far valere le funzioni anche dopo una sessione bisogna inserirle nel file .bashrc. Ho aperto il mio file con gedit . Come faccio poi ad inserire la funzione ccg, la copio paro paro in fondo al file senza aggiungerci nulla o devo scrivere qualcosaltro (oltre al codice della funzione)?

Re: come creare un "alias" con variabili in ingresso

Inviato: mercoledì 3 giugno 2015, 10:22
da 1001001
Sì sì, incolla semplicemente la funzione in fondo.
Ricordati che poi le modifiche avranno effetto solo sui terminali che apri dopo che hai salvato il file modificato (a meno che tu non chiami

Codice: Seleziona tutto

source ~/.bashrc
dai terminali già aperti)

Re: come creare un "alias" con variabili in ingresso

Inviato: mercoledì 3 giugno 2015, 12:53
da astrifiammante
ok tutto a posto!!!! :D

Re: come creare un "alias" con variabili in ingresso

Inviato: mercoledì 3 giugno 2015, 22:28
da 1001001
Ok! Se hai risolto ricordati di aggiungere [Risolto] al titolo del primo messaggio!

@vaeVictis
vaeVictis ha scritto:A fine discussione, me la rileggo e aggiungo un paio di "cose", se non ne avrete già parlato :)
Vai! :)

Re: [RISOLTO] come creare un "alias" con variabili in ingres

Inviato: giovedì 4 giugno 2015, 11:51
da vaeVictis
Ne avete parlato. Mi riferivo alla modifica al file .bashrc :)