Visualizzazione post con etichetta Linux. Mostra tutti i post
Visualizzazione post con etichetta Linux. Mostra tutti i post
28 gennaio, 2020
Gestire la linea di comando del terminale
Non è vero che con Linux si usa sempre il terminale, quello che Windows chiama Prompt dei comandi (o almeno una volta era così, non so se vale ancora, non sono aggiornato), ma a volte è comodo, anzi --a dirla tutta-- sì, si usa così.
Per esempio con Python è normale invocare lo script seguito dal nome del (o dei) file(s) di dati, di output, dei parametri (se ci sono), anzi per questi la prassi è di indicarli per primi. No, non ho un esempio --anzi sì: un classico, il classico Hello World!
Questa è la versione più semplice in C, che metto nel file di testo hw.c
#include <stdio.h>
int main() {
printf("Hello, World!");
return 0;
}
Siccome mi conosco come pasticcione di solito (anche se in questo caso è ridondante) comincio con verificare che non ci siano errori (l'opzione -c compila, crea il file binario hw.o ma non l'eseguibile):
$ gcc -c hw.c
$
ok, nessun messaggio, sembra tutto a posto, creo l'eseguibile:
$ gcc -o hw hw.o
$ ./hw
Hello, World!$
quasi ok! cioè funziona ma manca l'a-capo finale, correggo il codice
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
e ricompilo, questa volta --più fiducioso-- tutto in una passata:
$ gcc -o hw hw.c
$ ./hw
Hello, World!
$
ok! l'esempio è probabilmente troppo semplice ma si vede che i comandi dati nel terminale sono tutti molto simili e conviene quindi richiamarli con i tasti freccia. (si può verificare con history, anzi --meglio-- history | tail -10).
Quando i comandi sono meno brevi, composti da parole più lunghe, ripercorrere tutta la riga di comando può essere tedioso. E allora ecco le scorciatoie per la gestione della riga. Uh, uso lo script per il testo colorato raccontato qui, questo è il file dei dati e-cmd:
_RESpostamento del cursore_ec
_ReHome_ec o _ReC-a_ec : inizio della linea
_ReEnd_ec o _ReC-e_ec : fine della linea
frecce _Re<-_ec e _Re->_ec : un carattere per volta
_ReC_ec-frecce : una parola per volta
_RECancellazione_ec
_ReC-k_ec : cancella fino alla fine della riga
_ReM-d_ec : cancella fino alla fine della parola
_ReC-w_ec : cancella fino all'inizio della parola
_REIncollare il testo cancellato_ec
_ReC-y_ec : incolla l'ultimo testo cancellato
_RECopiare_ec
_ReC-C_ec : copia il testo selezionato
_REIncollare_ec
_ReC-V_ec : incolla il testo negli appunti (clipboard)
che compilo ed eseguo
Ok! Ah! dimenticavo C-x sta per Ctrl+x e M-x per Alt+x (M sta per Meta), secondo le convenzioni di Emacs; per M-d il tasto Alt si è reso necessario perché C-d è predefinito e importantissimo (chiude il terminale). Notare inoltre che nel copia/incolla c'è il Maiusc.
H/T per SR, prezioso revisore remoto 🤩
🔴🔵
24 giugno, 2019
ghis - grep | history non mi funziona da script e allora alias
OOPS! 😶 ho già scritto tutto nel titolo, posso lasciare vuoto il post! Ma non si usa e allora racconto.
Mi capita spesso di richiamare comandi; per questo c'è history e il file ~/.bash_history e i tasti freccia su e giù e altro ancora (chi ha detto fc?) ma alle volte --sapete la memoria, la mia-- devo scorrere e --ma c'è grep!
$ history | grep chmod
1021 chmod +x meter
1214 chmod +x pter
1673 chmod +x cdl-ck-1
1674 chmod +x cdl-ck-2
1871 chmod +x ptw0
1927 history | grep chmod
ah! ecco, il nome era cdl-ck-2, mnemonico (kwasy). In questo caso non serve ma lo so anch'io (quindi presumibilmente tutti) che per ri-eseguire un comando si può usare !N dove N è il numero indicato, per esempio !1927 ripete history | grep chmod.
Comodo, se un comando lo ripeti due volte lo ripeterai ancora e allora conviene farci lo script (cit. riportata male ma la sostanza è quella). Solo che non funziona. Ultimamente ci abbiamo provato, PLG, EL, BA, io e altri ancora che adesso dimentico di citare. Inizialmente avevamo pensato (PLG e me) che l'indagine classica --googlare Stack Overflow e il web tutto-- ci avrebbe rivelato cosa non andava e come fare ma niente, qualcuno riporta varianti del nostro script:
#!/bin/bash
echo 'cerco per' $1
history | grep $1
ma eseguito (notare l'echo per il debug) non è come si sperava:
$ bash ghis chmod
cerco per chmod
$
🤢 Panico? no, nope! 💥 si può fare l'alias:
$ alias ghis
alias ghis='history | grep'
$
sì, l'avevo già fatto prima di scrivere queste note, messo nel file ~/.bash_aliases ed è già attivo (altrimenti per vedere subito le modifiche inserite in ~/.bash_aliases occorrerebbe attivarlo con source ~/.bash_aliases, risaputo vero?). Funziona:
$ ghis chmod
2006 history chmod | grep
2007 history | grep chmod
2008 history | grep chmod 10
2009 history 10 | grep chmod
2011 bash ghis chmod
2016 ghis chmod
$
Sì nel frattempo ho eseguito diversi altri comandi; e sto barando, riporto solo la parte finale dell'output di ghis. Un ulteriore suggerimento (lo so che lo sapete ma se del caso...) trovo molto comodo aliasare anche grep:
$ alias grep
alias grep='grep --color=auto'
$
così l'espressione cercata sarà colorata (rosso per me).
🔴
14 giugno, 2019
Gestire le opzioni del terminale
No non il monitor (anche quello (almeno il mio) sarebbe da fare (fisicamente)) il terminale, quello che Windoze chiama Prompt dei Comandi.
Tutto parte con un tweet che rimanda qui.
Ci sono tre alternative, dice. Ma non solo la stessa cosa:
- tput clear produce tante righe vuote sufficienti a nascondere il testo, basta scrollare su per ritrovarlo;
- printf "\033c" reset del terminale; il contenuto precedente sparisce;
- clear esattamente come tput clear;
- ctrl-L come tput clear e clear.
Uhmmm... dubbi: io quando mi serve uso ^L. Non sapevo della sequenza esc-C. Ma anche CommandLineFu sa che non è stato esaustivo e nel giro di pochissimo lo ritwitta con variazioni (forse, sembra lo stesso). In questi casi io lancio
In breve, OK per esc-C, si può usare anche in esadecimale printf "\x1bc". No, niente decimali non va, proprio come una volta.
Ma c'è un altro comando: tput.
$ tput
Usage: tput [options] [command]
Options:
-S << read commands from standard input
-T TERM use this instead of $TERM
-V print curses-version
-x do not try to clear scrollback
Commands:
clear clear the screen
init initialize the terminal
reset reinitialize the terminal
capname unlike clear/init/reset, print value for capability "capname"
Misterioso, provo il man, capito niente; non è il mio giorno fortunato. Presto chiamo GNU Software e arrivo a tput: Portable Terminal Control
The tput command allows shell scripts to do things like clear the screen, underline text, and center text no matter how wide the screen is. To do these things, it translates the terminal-independent name of a terminal capability into its actual value for the terminal type being used.Ecco che tput reset fa il reset del terminale, come il comando printf "\033c" (o "\x1b") da cui ero partito e tput clear è equivalente agli altri tre, quelli che puliscono.
Poi ci sono altre cose, per esempio i colori, il grassetto, il sottolineato:
script tc
tput setab 7
tput setaf 1
echo
echo terminale con colori cambiati
echo -n adesso
tput bold
echo " "grassetto
tput sgr0; tput setab 7; tput setaf 1 #non so annullare il grassetto
echo -n e anche" "
tput smul
echo sottolineato
tput rmul
echo -n e volendo altro ancora
tput sgr0
echo -e "\n"
Non tutti i comandi che si trovano online sono abilitati (o sono io che non sono abbastanza nerd). Per esempio non so annullare il comando bold. Se si dovesse usare davvero tput converrebbe implementare funzioni, lo script precedente potrebbe diventare qualcosa così:
script tc1
function mycol() {
tput setab 7
tput setaf 1
}
function nobold() {
tput sgr0
mycol
}
mycol
echo
echo terminale con colori cambiati
echo -n adesso
tput bold
echo " "grassetto
nobold
echo -n e anche" "
tput smul
echo sottolineato
tput rmul
echo -n e volendo altro ancora
tput sgr0
echo -e "\n"
tput rev
echo colori fg e bg invertiti
tput sgr0
echo ""
🔴
04 maggio, 2019
Modi diversi per utenti diversi
È in corso un dibattito con due amici, PLG e AG, sui Massimi Sistemi, Windows e Linux. I pareri sono molto diversi, sto raccogliendo materiale, ma non trattenete il respiro, andrà per le lunghe. Anche perché c'è anche Android. E temo l'irruzione di iOS (sssht!).
Io non voglio intromettermi a gamba tesa, anzi un pochino (solo un po', nèh!). Una cosa recente, piccola, quasi trascurabile ma illustra --imho-- come agiscono gli utenti tipici dei due OS.
Ci viene richiesto di modificare una scritta inserendo uno spazio tra ogni carattere, così:
$ echo stringa da spaziare | inssp
s t r i n g a d a s p a z i a r e
$
Invece di aprire un editor e scrivere con gli spazi la stringa (o inserire gli spazi se la stringa già c'è con un editor) il linaro (it's me) sa che c'è sed e si costruisce uno script, questo:
#!/bin/bash
sed 's/\(.\{1\}\)/\1 /g;s/ $//'
Confessione: non l'ho scritto io; l'ho capiato, qui, dove viene anche spiegato (è particolare, meno comune di quelli usuali).
La stringa risultato dev'essere selezionata e copiata nella clipboard con Maiusc-Ctrl-C. Ma c'è un modo più semplice, ho lo script _k:
#!/bin/bash
xclip -f -selection clipboard
Per cui, per avere direttamente la stringa nella clipboard pronta per l'inserimento il comando diventa:
$ echo stringa da spaziare | inssp | _k
s t r i n g a d a s p a z i a r e
$
(sì, lo so che non si vede, se del caso provate, xclip è da installare).
Ha senso, ovviamente, se il testo da spaziare supera una certa dimensione, per esempio se il testo è nel file dati:
$ cat dati | inssp | _k
u n o
d u e
t e r z a r i g a
q u a t t r o
$
In alternativa a _k posso reindirizzare l'output con > out.txt (visto che mi adeguo alle usanze di Windows e uso l'estensione?).
Questa procedura vale ovviamente solo per Linux, in Windows non ho sed ma niente panico (cit.) lo script lo scrivo con Python, così (insspy):
#:/usr/bin/python3
import sys
f = sys.stdin
st = f.readline().strip()
stsp = ''
for c in st:
stsp += c + ' '
print(stsp.rstrip())
Facile vero? Funziona come lo script bash e funziona anche con Windows.
Quindi i due OS sono equivalenti? Non esattamente, gli utenti Windows sono molto meno disponibili a usare il terminale, vogliono finestre, bottoni e chissà quali altri widgets. Si usa ancora "widget" o sono solo più io? Anche la Wiki, lei non mi delude mai.
🔴
Iscriviti a:
Post (Atom)






