Newsgroup: it.comp.os.linux.iniziare
Titolo: interprete bash personalizzato

Ho creato questi due file
 
FILE (interpete): /home/utente/bin/mybash
 
#!/bin/bash
echo "interprete personalizzato"
 
 
FILE (script): /home/utente/test-mybash.sh
 
#!/home/utente/bin/mybash
echo "test in esecuzione"
 
 
Ora quando lancio il file /home/utente/test-mybash.sh, mi appare solo
"interprete personalizzato".
Perchè "test in esecuzione" non viene visualizzato?


Per rispondere a questa domanda, devi capire cosa
esattamente fa la prima riga, cioe`:
 
#!...
 
Ci sono almeno due modi per eseguire uno script.
 
Uno e` (se supportato):
 
cat script | interpreter
 
L'altro e` (se supportato):
 
interpreter script
 
Ovviamente, *non* sono completamente equivalenti.
 
Il commento #! fa una di queste due cose.
 
bye,
 
-- 
 
piergiorgio

Addi' 08 lug 2013, one4all scrive:

Perche' echo non e' un comando ne' interno (builtin) ne' esterno
dell'interprete scelto, cioe' di test-mybash.sh
 
-- 
Tanti saluti
 


Forse non ho colto cosa intendi, ma non
credo sia quello il problema.
"echo" nello script non viene _mai_ eseguito,
indipendentemente da chi lo dovrebbe fare o
da che comando sia.
 
Basta sostituire (od aggiungere) in "mybash":
 
echo "interprete personalizzato"
 
Con
 
echo "$@"
 
Per capire cosa succede,
 
bye,
 
-- 
 
piergiorgio

 Il commento #! fa una di queste due cose.
 
ok, cmq io vorrei costruire un interprete basato su bash, ma con 
funzionalità aggiuntive:
 
#!/bin/bash
 
. ~/lib/pippo.sh
 
function validate {}
function notify {}
 
 
E' possibile?

 Per capire cosa succede,
 
Fatto. Risultato: idem come senza, c.v.d.
 
Comunque: io piu' di cosi' non te/me lo so spiegare, se ci legge ad
esempio Lem Novantotto ci sa dare certamente molte altre spiegazioni.
 
-- 
Tanti saluti
 

 E' possibile?
 
Credo di si, ma per fare questo (che si era gia`
discusso), devi prima capire esattamente come
funziona l'interprete shell.
E come funziona il discorso del commento #!...
 
Non e` difficile, come scritto nell'altro reply,
metti un 'echo "$@"' in "mybash.sh" e vedi cosa
ti stampa.
 
Poi potrai sostituire "echo" con il comando adatto.
Poi potrai mettere, prima del "comando adatto", le
chiamate alle librerie comuni, piu` o meno come hai
gia` scritto qui sopra.
 
bye,
 
-- 
 
piergiorgio

 esempio Lem Novantotto ci sa dare certamente molte altre spiegazioni.
 
Guarda, non credo servano "spiegazioni",
quello che succede e` chiarissimo.
 
Come scritto sopra, probabilmente stiamo
dicendo la stessa cosa, ma con giri di
parole diversi.
 
bye,
 
-- 
 
piergiorgio

 Poi potrai sostituire "echo" con il comando adatto.
 
Cosa intendi per comando adatto?


 esempio Lem Novantotto ci sa dare certamente molte altre spiegazioni.
 
Sicomenò. Io, dare spiegazioni a te e a Piergiorgio! Complimenti, sei 
spiritoso. :)
 
Comunque, essendo ben chiaro che non conosco alcunché del come crearsi un 
interprete evoluto... per quel che posso speculare, direi così:
 
inserire come prima riga di uno script qualcosa come:
 
#!/miointeprete
 
significa che, quando lo script verrà banalmente chiamato con:
 
$ ./mioscrypt mieiparametri
 
il vero comando eseguito, grazie all'intervento del kernel, sarà invece:
 
$ /miointerprete ./mioscript mieiparametri
 
(e, a *questo* punto, la prima riga di cui sopra verrà ignorata come 
commento).
 
Sia mioscript:
#!/tmp/miointerprete
echo "Qui inizia mioscript"
miafun "$@"
echo "Ecco fatto!"
exit 0
 
Se costruisco miointerprete così:
 
#!/bin/bash
echo "Script interpretato da miointerprete"
echo
miafun () { echo "$@ molto bello."; }
export -f miafun
/bin/bash "$@"
echo
echo "Miointerprete passa e chiude"
exit 0
 
allora sono a cavallo:
 
$ ./mioscrypt chiamerà come interprete lo script miointerprete, il quale:
 
a) sarà interpretato da bash (che sa il fatto suo);
b) dopo aver caricato le estensioni che deve, ed averle esportate, 
chiamerà *esplicitamente* bash perché interpreti in sua vece mioscrypt 
(giacché miointerprete, di suo, non sa interpretare un fico secco). Ecco 
quel che succede: 
 
$ ./mioscrypt Io sono
Script interpretato da miointerprete.
 
Qui inizia mioscrypt.
Io sono molto bello.
Ecco fatto!
 
Miointerprete passa e chiude.
$
 
È di questo che parlate? Ci ho preso, più o meno?
 
BTW: tutta l'utilità di 'sta roba a me pare molto... improbabile, per 
così dire. Non sarebbe più semplice e comodo usare direttamente i file di 
configurazione di bash per le "estensioni" desiderate?
-- 
Bye, Lem
Ceterum censeo ISLAM esse delendum
_________________________________________________________________
Non sprecare i cicli idle della tua CPU, né quelli della tua GPU.
 
http://www.worldcommunitygrid.org/index.jsp
 
http://www.rnaworld.de/rnaworld/
 
http://home.edges-grid.eu/home/
 
 
http://www.gpugrid.net/
 

 mioscript
 
Temo ciò comprovi quanto sospetto da tempo, cioè che ho serissimi 
problemi di dissociazione mentale. Urge lobotomia. ;(
 
Voi scegliete ad libitum una grafia, e restate con quella.


 funzionalità aggiuntive:
 
Le uniche funzionalità aggiuntive che mancano alla bash sono:
 
 1) preparare il caffè
 2) rigovernare i letti
 3) portare il cane a fare pipì
 
/irony mode on
 
PS Se tu avessi le capacità di modificare la bash o di 
replicarla ex novo allora io chiederei aiuto a te.
 
/irony mode off
 
 

 configurazione di bash per le "estensioni" desiderate?
 
Cioè?
Un esempio?
 

 Cosa intendi per comando adatto?
 
Riprova l'esperimento chiamando lo script che usa
"mybash.sh" come shell.
 
Tu ha due script, uno "script.sh", l'altro "mybash.sh".
 
"script.sh":
 
#!/home/utente/bin/mybash.sh
echo "ciao"
 
"mybash.sh":
 
#!/bin/bash
echo "mybash"
echo "$@"
 
Esegui:
 
$> script.sh
 
E vedi cosa succede.
 
bye,
 
-- 
 
piergiorgio

 configurazione di bash per le "estensioni" desiderate?
 
Adesso non mi confondere lo studente,
una cosa per volta... :-)
 
bye,
 
-- 
 
piergiorgio

one4all ha scritto:

A naso suggerirei d'usare /etc/bashrc (o /etc/bash.bashrc, quel che è sul
tuo sistema) per le estensioni o personalizzazioni system-wide, ed
i vari /home/$user/.bashrc per quelle specifiche per utente. 
 
Parlo di funzioni, alias, source-izzazioni varie...
 
Naturalmente dovrai controllare che i vari file vengano richiamati in
_tutte_ e _sole_ le situazioni che t'interessano (quindi: qualsiasi bash,
oppure solo bash di login...).
 
Fatti un'idea qui, magari:
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_01.html
 
http://www.modlost.net/home/article/understandin-bash-configuration-files.html
 
http://www.gnu.org/software/bash/manual/bashref.html#Bash-Features
 
 
Ricorda che "info bash" è tuo amico. :)


 Hai rovinato la sorpresa... :)
 
Ah, cazzarola! Allora mi taccio. :)


 commento).
 
Vedi che dicevo giusto? Questa del kernel e di "#!" -> "#", non le
sapevo. Interessanti anche i due script che poi guardero' meglio.
 
Ti avevo invocato perche' mi sembrava difficile che potessi sbagliarmi,
e in ogni caso m'interessava appurarlo, mentre invece poi Piergiorgio
m'ha detto che dicevamo la stessa cosa ma con parole diverse.
 
-- 
Tanti saluti
 

 Questa del kernel e di "#!" -> "#", non le sapevo.
 
"shebang"

Addi' 09 lug 2013, Andrea D'Amore scrive:

TNX!!
 
$ dict shebang
 
5 definitions found
 
From The Collaborative International Dictionary of English v.0.48 [gcide]:
 
  Shebang \She*bang"\, n. [Cf. {Shebeen}.]
     1. A jocosely depreciative name for a dwelling or shop; a
        primitive dwelling; a shanty. [Slang, U.S.]
        [1913 Webster]
 
     2. The structure of an object, process, organization, or
        anything viewed as complicated; -- used primarily in the
        phrase
 
     {the whole shebang}; as, it comes with unnecessary frills,
        but you have to buy the whole shebang. [informal]
        [PJC]
 
     3. (computers) [Possibly derived from shell bang; the
        character ! is referred to in some computer contexts as
        bang.] The character sequence #!, which frequently begins
        shell scripts in a Unix system.
        [PJC]
 
From WordNet (r) 3.0 (2006) [wn]:
 
  shebang
      n 1: an entire system; used in the phrase `the whole shebang'
 
From The Free On-line Dictionary of Computing (18 May 2012) [foldoc]:
 
  shebang
 
     <operating system> (Or "shebang line", "{bang path}")
     /sh*-bang'/ (From "{sharp}" and "{bang}") The {magic cookie}
     "#!" used in {Unix} to mark the start of a {script}, e.g. a
     {shell script} or {Perl script}.
 
     Under {Unix}, if the first two bytes of an {executable} file
     are "#!", the {kernel} treats the file as a script rather than
     a {machine code} program.  The word following the "!" (i.e.,
     everything up to the first {whitespace}) is used as the
     {pathname} of the {interpreter}.  For example, if the first
     line of an executable is
 
      #!/usr/local/bin/perl
 
     the script will be treated as a {Perl} script and passed as an
     argument to /usr/local/bin/perl to be interpreted.  Some
     variants of Unix also allow one or more parameters to be
     passed to the interpreter, for example, you can write
 
      #!/usr/bin/perl -w
 
     and the script will be started as if you typed
 
      /usr/bin/perl -w <filename>
 
     on the command line.  Also, most modern kernels ignore any
     whitespace between the "!" and the interpreter pathname.  Even
     some modern kernels have fairly small limits (e.g. 32) on the
     length of line they will accept, making long pathnames and
     arguments somewhat unportable.
 
     [Does anyone call this a "magic string"?]
 
     (1998-05-06)
 
 
From The Jargon File (version 4.4.7, 29 Dec 2003) [jargon]:
 
  shebang
   /sh@.bang/, n.
 
          [possibly a portmanteau of "sharp bang"] The character sequence "#!"
          that frequently begins executable shell scripts under Unix. Probably
          derived from "shell bang" under the influence of American slang "the
          whole shebang" (everything, the works).
 
 
From hazon_en_it [hazon_en_it]:
 
  shebang [she·bang] s. (sl.) affare; questione.
 
 
-- 
Tanti saluti
 

 E vedi cosa succede.
 
Visto e constatato!!!
 
 

 Visto e constatato!!!
 
Se metti "source" al posto di "echo" ottieni
il risultato che vuoi.
 
P.S.: "source ./script.sh" e` come ". ./script.sh".
solo che "source" e` piu` leggibile.
 
bye,
 
 
-- 
 
piergiorgio

 i vari/home/$user/.bashrc per quelle specifiche per utente.
 
Ma ~/.bashrc viene solo richiamato solo quando viene aperto un nuovo 
terminale, non quando viene lanciato uno script...
 
 

 solo che "source" e` piu` leggibile.
 
certo ;)
 

 terminale, 
 
No, al limite quando viene eseguita una nuova istanza di bash, e 
comunque non sempre ma per le istanze definite come interattive. A 
titolo di esempio il mio emulatore di terminale è impostato per lanciare 
shell di login.
I dettagli sono nel solito bash(1), non ricordo come si chiami la 
sezione  a cui mi riferisco.

 comunque non sempre ma per le istanze definite come interattive. 
 
O per le istanze non interattive se imposti le variabili d'ambiente $ENV
o $BASH_ENV oppure avviate con il parametro --login
 
 
 

 oppure avviate con il parametro --login
 
Ricordavo che bashrc *non* fosse per le shell di login, ma è a memoria.

 Ricordavo che bashrc *non* fosse per le shell di login, ma è a memoria.
 
In effetti hai ragione. Però nei vari *profile viene sempre caricato .bashrc
tranne pochi casi (per esempio se un utente modifica il suo *profile o
se .bashrc è un link a .profile), quindi stiamo lì, di solito .bashrc
viene eseguito sempre. 
 
Credo che all'OP interessi sapere che l'effetto da lui voluto si può 
anche ottenere facendo un file *rc alternativo.
 
Per chiudere, la vera differenza tra le sessioni di login e le altre è
che nelle sessioni interattive viene eseguito prima /etc/profile e poi
gli altri script di configurazione.