Cos’è? dov’è?

Un paio di note di programmazione Bash e dintorni; niente di speciale, niente che non si sappia ma c’è un motivo perso: lunedì (ormai non più l’ultimo, ho temporeggiato) me ne serviva un pezzo, ricordavo di averlo fatto ma non riuscivo a trovarlo. Forse se lo metto nel blog… 😋

Quelli come me che installano roba per provarla e non la usano subito e poi —uh! già detto nella frase prima.

Se ci si accorge di usare tre volte (numero che può variare tra i nerds, ma comunque non tanto più grande di tre) un comando composto da più parole probabilmente ti conviene fare uno script. Io lo faccio, di solito.

which
Il primo problema è che la prima riga dello script –la shebang– deve il nome dell’eseguibile, assoluto, completo di tutta la path. Beh, questo è semplice, per esempio:

alias
A volte invece dello script conviene l’alias, per esempio per la REPL di IPython3 io ho:

OK, fin qui niente di nuovo. Ma c’è un utility che può servire, ecco

file
file fa tante cose, vedi man in locale o qui.

Funziona anche quando non penseresti, per esempio

Non è come potrebbe pensare l’utente Windows, non centra l’estensione:

Con ‘opzione -i la risposta è diversa:

E con gli scripts? Eccone uno classico:

hw.sh

#!/bin/bash
echo "Hello World!"

file mi dice

Abilitando lo script il risultato non cambia

Ci siamo quasi, torno a which:

Non lo vede, ma vede altri scripts, per esempio

Ah! funziona solo per le directories elencate nella path.

A ottobre (ahemmm… non l’ultimo) avevo unito which e file, così

tyk

#!/bin/bash

if [[ $# == 0 ]]; then
    exit 2
fi

N=$1
file $(which $N)

OK, ritrovato; ma non è quello che volevo.

alias
Prima accennavo agli aliases, ecco, potrebbe essere più interessante, per esempio

Si può scriptare? uhmmmm…

tyka

#!/bin/bash -i

if [[ $# == 0 ]]; then
    exit 2
fi

AL=$1
r1=$(alias $AL)
r2=$(echo $r1 | sed "s/^.*='//;s/'$//")
which $r2

Notare l’opzione -i nella shebang.

Finora ho trattato script interpretati. Cosa capita se creo l’eseguibile compilando? ecco qualche esempio.

hw.c

#include

void main()
{
    printf("Hello World!\n");
}

hw.nl

(println "Hello World!")
(exit)

hw.rkt

#lang racket/base

(println "Hello World!")

hw.hs

main :: IO ()
main = putStrLn "Hello, World!"

Uh! ‘na cosa che mi ricorda dello scorso millennio: qualcuno degli eseguibili ha informazioni per il debug. Naturalmente la dimensione degli eseguibili ottenuti varia tantissimo

Esiste il comando strip ma serve a poco; ormai lo spazio su disco non è più un problema.

OK, arrivo al punto. Come faccio a cercare eseguibili e scipts con certe caratteristiche?

Distinguere gli script dagli eseguibili è immediato, via file -i

Diventa allora (kwasy) immediato visualizzare la ricerca:

shb
Nota:
corretto in [[ $# -gt 0 ]] (era [[ $# -gt 1 ]])

#!/bin/bash

while [[ $# -gt 0 ]] ; do
  T=$(file -i $1)
  B=$(echo $T | grep "binary")
  if [ ${#B} -gt 0 ]; then
    echo $T     #  binario
  else
    echo $1":" $(head -1 $1) #  testo
  fi
  shift
done

sì ho parecchi comandi che iniziano con _, uno dei quali compilato _u.

Con qualche modifica posso cercare gli script di un determinato linguaggio:

shbp
Corretto l’indice come indicato per shb

#!/bin/bash

P=$1
shift

while [[ $# -gt 0 ]] ; do
  T=$(file -i $1)
  B=$(echo $T | grep "binary")
  if [ ${#B} -eq 0 ]; then
    SB=$(head -1 $1)
    OK=$(echo $SB | grep $P)
    if [ ${#OK} -gt 0 ]; then
      echo $1":" $SB
    fi
  fi
  shift
done

Ed ecco la versione per i compilati:

bex
Corretto l’indice come indicato per shb

#!/bin/bash

while [[ $# -gt 0 ]] ; do
  T=$(file -i $1)
  B=$(echo $T | grep "binary")
  if [ ${#B} -gt 0 ]; then
    echo $1
  fi
  shift
done

OK, mi resta da chmodarne un po’, metterne un po’ in ~/bin e fare pulizia. Prossimamente… Forse… 😋

🤩

Annunci
Posta un commento o usa questo indirizzo per il trackback.

Trackback

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

w

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: