script

Bash: usare una variabile per costruire un comando (con wildcards)

bash

Poniamo che in uno script vogliamo eseguire un comando, i cui parametri sono all'interno di una variabile (o, più in generale, parte o tutta la linea di comando è presente in una variabile). Normalmente eseguiremo una cosa del genere:

PARAMS="-par1 -par2"
command $PARAMS

Fin qui nessun problema. Gli scogli arrivano se dentro $PARAMS sono presenti delle wildcards, ad esempio:

PARAMS="-par1 --exclude={/dir1/*,/dir2/*}"
command $PARAMS

In questo caso l'esecuzione del comando non funziona o, meglio, non funziona allo stesso modo di aver eseguito direttamente:

command -par1 --exclude={/dir1/*,/dir2/*}

Bash: array associativi e come copiarli

bash

La bash ha il supporto sia per gli array a indice numerico che per gli array associativi. Vediamo come usarli.

Array a indice numerico

Per quanto riguarda i primi è possibile usare queste forme per la dichiarazione:

var[index]=value

var(value1 value2 value3...)

(in questo caso il primo indice parte da "0")

var([index1]=value1 [index2]=value2 ...)

Ad esempio, questi comandi generano la stessa variabile:

test[1]=one
test[2]=two
echo ${test[1]}
unset test
test=([1]=one [2]=two)
echo ${test[1]}

E' possibile usare anche la forma "+=" per aggiungere un array a un altro.

var += ([index]=value ...)

Da notare che è possibile dichiarare una variabile come array usando la forma:

declare -a var

Linux shell: impostare una cartella condivisa dove tutti i file sono modificabili da gruppo

linux

 

Se si vuole avere una cartella condivisa da più utenti, nella quale tutti possono inserire file e vedere/manipolare anche i file degli altri, senza problemi di diritti, la soluzione non è immediata. I diritti di creazione file per un utente loggato e/o le sue impostazioni di gruppo di default (in particolare per l'utente root) possono creare l'inconveniente che alcuni file non sono leggibili da tutti.

Per evitare questo usiamo 2 caratteristiche della gestione permessi di linux: il flag "s" (setUID) e la gestione FACL (file access control list).

Eseguire script quando la connessione wireless si attacca

script

Ci sono situazioni in cui desideriamo avviare una procedura ogni volta che il nostro sistema si aggancia alla rete (o, al contrario, si disconnette).

Se usiamo il sistema standard "networkmanager" questo è molto semplice, infatti basta inserire uno script all'interno della cartella:

/etc/NetworkManager/dispatcher.d

Gli script in quella cartella vengono eseguiti in ordine alfabetico crescente alla connessione (e decrescente alla sconnessione). Per questo si usa la solita pratica comune di usare il formato "NN_nome", ad esempio "30_popfile".

Inoltre è importante che siano con owner "root.root" e diritti "755".

Search & Replace su più file da riga di comando

script

Se vogliamo sostituire del testo su tutti i file che contengono il testo originale all'interno di un percorso possiamo fare in questo modo:

grep -RlZ "TESTO_ORIGINALE" . | xargs -0 -l sed -i -e 's/TESTO_ORIGINALE_ESC/TESTO_DA_SOSTITUIRE_ESC/g'

Per *_ESC intendo che il testo deve considerare l'escaping delle "/".

Ad esempio:

grep -RlZ "/system_home/eric/" . | xargs -0 -l sed -i -e 's/\/system_home\/eric\//\/home\/eric_arch\//g'

Sostituisce tutti i /system_home/eric/ con /home/eric_arch/.

Il grep iniziale è una ottimizzazione per evitare di fare il search & replace di tutti i file. Per vedere se sta estranendo i file giusti:

[code]

Spostare una finestra alla posizione corrente del mouse

shell

Problema: ho 2 monitor attivi in modalità twinview (quindi il sistema vede un unico monitor "grande"). Per qualche motivo stacco temporaneamente uno dei 2 monitor, magari quello principale con la taskbar.

Non voglio resettare la configurazione dei monitor, ma vorrei riuscire velocemente a spostare le finestre nel monitor corrente.

 

Sembra banale, ma non lo è. Con ALT+TAB si accede alla finestra, ma poi riuscire a spostarla è un impresa. Bisognerebbe ricordare a memoria come arrivare nel menu di finestra, come attivare lo sposta (se non è massimizzata).

 

Soluzione: uno script che sfrutta xdotool, da associare a una combinazione di tasti.

 

Per prima cosa installiamo xdotool, se non l'abbiamo già: