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 il bat-segnale --oops! volevo dire SO, Stack Overflow. Ed ecco: What does printf(“\033c” ) mean?

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.

🔴