[Risolto] da comando in terminale a funzione

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
pagui
Prode Principiante
Messaggi: 6
Iscrizione: giovedì 6 gennaio 2011, 3:35

[Risolto] da comando in terminale a funzione

Messaggio da pagui »

Ciao a tutti, vorrei trasformare questo comando:

Codice: Seleziona tutto

find . -type d -print0 |  while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in %s\n" "${#files[@]}" "$dir"; done | sort -d -k2
in una funzione da inserire nel file .bashrc o in un alias in .bash_alias, e' possibile? Dopo varie prove non sono riuscito a capire come fare...

Grazie
Ultima modifica di pagui il mercoledì 18 gennaio 2017, 10:54, modificato 1 volta in totale.
Avatar utente
bingel
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4026
Iscrizione: lunedì 3 aprile 2006, 10:17

Re: da comando in terminale a funzione

Messaggio da bingel »

Scrivendola così com'è (tutta su una riga) dovrebbe già funzionare senza problemi.

Se preferisci indentarla:

Codice: Seleziona tutto

find . -type d -print0 | while read -d '' -r dir; do 
  files=("$dir"/*)
  printf "%5d files in %s\n" "${#files[@]}" "$dir"
done | sort -d -k2
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: da comando in terminale a funzione

Messaggio da nuzzopippo »

Per definire una funzione in uno script bash esistono due distinte notazioni :

1° - dichiarare esplicitamente che è una funzione facendo seguire il nome della funzione con il corpo delle istruzioni relative compreso tra parentesi graffe, esempio :

Codice: Seleziona tutto

function dimmi_ciao {
	echo "Ciao!"
}
2° - Inserire direttamente il nome della funzione seguito da parentesi tonde, il corpo delle istruzioni sempre tra parentesi graffe, esempio :

Codice: Seleziona tutto

dimmi_ciao() {
	echo "Ciao!"
}
Per eseguire funzioni di tal genere è sufficiente richiamarle nel corpo delle istruzioni principali

Le funzioni possono ricevere dei parametri, restituire dei valori (anche intercettando dei comandi "echo") od anche utilizzare delle variabili locali al corpo principale dello script, se dichiarate prima della definizione di funzione ... la casistica è complessa, Ti inviterei a leggere questo articolo sulla guida bash pubblicato sul sito di Pluto.it.

L'utilizzo di una eventuale funzione va studiato e pianificato nella stesura del codice, in effetti una funzione che venga utilizzata una sola volta potrebbe essere tranquillamente sostituita dalle sue istruzioni, come ha già detto @bingel, a meno non si voglia evidenziarne la logica, sono molto utili per operazioni ripetitive

[Edit] Per il resto : interessante l'obiettivo che Ti poni, sono andato a vedere come creare un alias, ma devo approfondire, il "man alias" non da risultato sul mio sistema e non sono pratico della materia, di norma preferisco fare piccoli script specifici, nel caso lo farei passando la direttrice da conteggiare quale parametro

[Ri-Edit] Verificato che con gli alias il comando diretto da Te posto non viene preso, ho trovato una possibile alternativa :

Nella home mio sistema uso una cartella "gestione_sistema/scripts" per gestire, appunto, il mio sistema, ho creato uno script partendo dal Tuo comando :

Codice: Seleziona tutto

#!/bin/bash

if [ "$1" == '' ]
then
	mydir=$(pwd)
else
	mydir="$1"
fi

find $mydir -type d -print0 |  while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in %s\n" "${#files[@]}" "$dir"; done | sort -d -k2
chiamandolo "contafile" e dandogli i permessi di esecuzione, poi alla fine del ".bashrc", nella home, ho inserito :

Codice: Seleziona tutto

# test di alias script personale
alias cntfile='~/gestione_sistema/scripts/contafile'
e funziona :D scrivendo "cntfile directory_da_misurare" mi conteggia quella passata quale parametro, altrimenti quella corrente
Fatti non foste a viver come bruti ...
pagui
Prode Principiante
Messaggi: 6
Iscrizione: giovedì 6 gennaio 2011, 3:35

[Risolto] Re: da comando in terminale a funzione

Messaggio da pagui »

Grazie mille per le risposte e le spiegazioni!! Funziona tutto correttamente, ho inserito nel file ~/.bashrc

Codice: Seleziona tutto

function count_file {
if [ "$1" == '' ]
then
   mydir=$(pwd)
else
   mydir="$1"
fi
find $mydir -type d -print0 |  while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in %s\n" "${#files[@]}" "$dir"; done | sort -d -k2
}
ho dato

Codice: Seleziona tutto

source ~/.bashrc
e funziona tutto correttamente, grazie anche per aver migliorato lo script ;)
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [Risolto] da comando in terminale a funzione

Messaggio da crap0101 »

si può anche definire un alias, l'unica accortezza è sostituire gli apici singoli dell'opzione -d di read con quelli doppi in modo da poter racciudere tutta la command line tra quelli singoli

Codice: Seleziona tutto

crap0101@orange:/tmp/foo$ find . -type d -print0 |  while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in %s\n" "${#files[@]}" "$dir"; done | sort -d -k2
    4 files in .
    1 files in ./D
    1 files in ./D/E
    1 files in ./D/E/F
crap0101@orange:/tmp/foo$ alias eee='find . -type d -print0 |  while read -d "" -r dir; do files=("$dir"/*); printf "%5d files in %s\n" "${#files[@]}" "$dir"; done | sort -d -k2'
crap0101@orange:/tmp/foo$ eee
    4 files in .
    1 files in ./D
    1 files in ./D/E
    1 files in ./D/E/F
crap0101@orange:~/.config/transmission$ find . -type d -print0 |  while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in %s\n" "${#files[@]}" "$dir"; done | sort -d -k2
    7 files in .
    3 files in ./blocklists
  955 files in ./resume
  955 files in ./torrents
crap0101@orange:~/.config/transmission$ eee
    7 files in .
    3 files in ./blocklists
  955 files in ./resume
  955 files in ./torrents

http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 20 ospiti