Autojump


Posso raccontarvi un po’ di storia personale? Sì?
OK, allora quando ho iniziato a lavorare mi sono trovato un minicopmuter (mini è fuorviante, pensate a un armadio grosso) tutto mio. Cioè no ma da gestire.
Era, l’ho già detto altre volte, un Prime, anzi PR1ME.
E era arrivato un Prime perché degli amici e colleghi avevano il Prime (il loro capo era appena tornato da MIT, vicino a Natick, dove c’era la fabbrica dei Prime –bei tempi, sigh!
Uno dei miei amici (anche se non ricordo chi) aveva deciso di semplificare il comando cd (sì, sul Prime non si chiamava cd ma attach, abbrevviabile in a; come per il VMS del Vax i comandi potevano essere abbreviati, basta che non ci fossero conflitti, ancora meglio del tab di Unix/Linux).
Per cui A LAVORI 1 2 poteva essere scritto J L. Bella comodità, l’avevo adottata al volo. E poi questo comando l’ho rifatto per MS-DOS, prima come batch command e poi con Turbo Pascal, antenato di Delphi.

Poi ho provato a farlo anche su Linux, e non ci sono riuscito. Adesso vi faccio vedere il perché.

Con Windows si può creare questo semplice script (loro non li chiamano script ma è uno script), j-t-w.bat

@echo off
c:
cd C:\DOCUME~1\Alice\IMPOST~1\Temp
echo sei in
cd
echo fatto.

eseguendolo nel Prompt dei comandi otteniamo

Come si vede al termine dello script la directory corrente è diventata Temp sul disco C:.
Proviamo a fare la stessa cosa con Linux, ecco lo script t.sh

#!/bin/sh
cd /tmp
echo sei in $(pwd)
echo fatto.

provo a eseguirlo

OPS! non funziona. Durante l’esecuzione dello script è effettivamente in /tmp ma quando lo script termina mi ritrovo nella directory di partenza. OK, la cosa è logica e naturale, Linux (e Unix prima) sono fatti meglio ma non fa quello che volevo. E non è facile farglielo fare.

La cosa all’inizio mi dava parecchio fastidio e ogni tanto riesumavo il progetto, senza concludere nulla. Cioè c’ero riuscito in un paio di modi ma non eleganti. Poi qualcuno (credo sia stato il prof Lipari ma non riesco a rintracciare il link) mi ha segnalato Autojump di joelthelionJoël Schaerer.

Dai, non era facile: bravo Noël, le lion! C’è riuscito con due script, uno tranquillo in Python e uno terribile in bash (e zsh, per chi usa questa shell). Noël è davvero un leone.

Autojump –in realtà si usa il comando j, proprio come facevamo su Prime, anche se allora j derivava da join– lo trovate nel Software Center di Ubuntu ma conviene installare l’ultima versione da github.

Per chi usa spesso il terminale è comodo, anche se ogni tanto mi fa ricadere nella tentazione di capire come funziona.

Era da un po’ che non mi capitava poi qualcuno ne ha parlato recentemente e mi sono deciso a prendere il toro per le corna: vediamo se questo post mi libera da questa ossessione.

Ah! visto che i miei amici Bit3Lux e Lightuono stanno portando avanti un corso di bash, questo post è dedicato a loro 😉

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • evilripper  Il 19 febbraio 2012 alle 14:59

    il prime sembra composto da 3 lavatrici e un frigorifero!!!! :)))) chissa se ne esistono ancora di funzionanti.

  • juhan  Il 19 febbraio 2012 alle 15:07

    Le “lavatrici” sono i dischi. Il mio era da ben 80MB e ne avevo uno solo. sopra le unità si vedono le custodie; sì erano grossi così.
    L’armadio invece contine CPU e le schede per la stampante e le seriali (quelle he adesso sono diventate le USB, allora RS232. Manca il nastro nell’anta superiore dell’armadio. Sempre il mio aveva ben 512KB di RAM 😀
    Purtroppo non ho manco una foto.
    Non essendoci più la ditta dubito ce ne siano. Era usato (diceva la pubblicità) in parecchie università tra le quali l’MIT dove un “nostro” dottorando (allora non si chiamavano così) l’ha incontrato. Era usato anche dalla Casa Bianca, sempre secondo la pubblicità.
    Aggiornamento: http://www.ricomputermuseum.org/Home/equipment/prime-computer-se50m (più nuovo del mio) googlando per prime computer museum c’è paracchia roba, compresa la copertina del manuale del PMA (assembly).

  • MarcoMarco  Il 19 febbraio 2012 alle 15:10

    “E non è facile farglielo fare”. E perché mai?

    Elimina #!/bin/sh alla prima riga, e sei a posto 🙂 E sei hai dei dubbi che senza possa non funzionare con altre shell, cambia la seconda riga in:

    echo sei in `pwd`

    e stai sicuro che anche tcsh te lo digerisce.

    Autojump è figo, ma onestamente con la tab-completion di ogni shell che si rispetti, non è poi così fondamentale.

    • juhan  Il 19 febbraio 2012 alle 15:15

      Marco, il problema è che terminato lo script (chiuso il processo) sei nuovamente nella directory da cui l’avevi lanciato. A meno che mi sfugga qualcosa.
      Rileggendo non sono più tanto sicuro di aver capito 😉 OK per la shebang che comunque serve, caso mai da modificare.

  • glipari  Il 19 febbraio 2012 alle 15:42

    Spiegazione: quando esegui un programma dalla shell, la shell forka un processo. Se fai cd da dentro il processo, cambi la directory del processo, non del padre (ovvero della shell). Se vuoi cambiare la directory del padre, devi fare qualche trucco tipo questo:

    http://stackoverflow.com/questions/3786678/change-working-directory-in-shell-with-a-python-script

    Non so come faccia autojump (magari sarebbe il caso di guardarsi un po’ il codice…).
    Comunque, io trovo autojump fondamentale. Ho molte directory profonde, e la necessità di saltarci spesso. Con l’autocompletion si può fare ma alla lunga mi prende qualche secondo pensare tutto il percorso da fare. con j posso comunque usare l’autocompletion. Insomma, io lo raccomando.

    • juhan  Il 19 febbraio 2012 alle 15:47

      Mi sa che l’argomento non finisce qui: non ne usciro da questa ossessione!
      Bel suggerimento; StackOverflow andrebbe perlustrato meglio 😀

    • juhan  Il 19 febbraio 2012 alle 16:37

      OK! Il metodo usato da Autojump è quello di StackOverflow. Prof è il caso di fare un post illustrativo? O ormai il mystero è svelato?

  • MarcoMarco  Il 19 febbraio 2012 alle 21:09

    Mi sa che vi state complicando la vita, e/o che mi sono spiegato male 🙂

    Se eliminate la shebang, la shell non forka più il processo, ma esegue lo scritto nello scope locale, dunque mantenendo i cambiamenti fatti dallo script (cambiamenti di directory o di variabili d;ambiente, per esempio).

    Ma anche senza eliminare la shebang, basta usare ‘source’ per ottenere l’effetto di non formare un processo autonomo. Voilà:

    [Marco@macdelma Desktop]$ pwd
    /Users/Marco/Desktop
    [Marco@macdelma Desktop]$ cat test.sh
    #!/bin/sh
    cd /tmp
    echo sei in $(pwd)
    echo fatto.% [Marco@macdelma Desktop]$ ./test.sh
    sei in /tmp
    fatto.
    [Marco@macdelma Desktop]$ pwd
    /Users/Marco/Desktop
    [Marco@macdelma Desktop]$ source ./test.sh
    sei in /tmp
    fatto.
    [Marco@macdelma /tmp]$ pwd
    /tmp
    [Marco@macdelma /tmp]$

    • juhan  Il 19 febbraio 2012 alle 21:17

      Sì con source funziona.
      Mi sa che ci sarà una seconda puntata, prossimamente.

    • glipari  Il 19 febbraio 2012 alle 23:11

      Ciao Marco, con source naturalmente funziona. Ma se non vuoi usare source, con o senza shebang, se “esegui” uno script, allora si forka un processo. O mi sono perso qualcosa della bash?
      (ho provato, se fai chmod +x script.sh e poi ./script.sh, non ti cambia directory…)

      • MarcoMarco  Il 20 febbraio 2012 alle 09:03

        No, hai ragione tu. Avevo un vecchio ricordo (probabilmente basato su tcsh, quando ancora usavo quella shell, e chissà quale versione) dell’assenza di di shwbang che evitava un fork. Ma in effetti non è così. ‘source’ resta l’unica soluzione affidabile.

  • bit3lux  Il 22 febbraio 2012 alle 00:30

    Ciao Juhan, a me funzione anche così:

    #!/bin/bash
    cd /tmp
    echo sei in $(pwd)
    echo fatto.
    bash

    ./test.sh

    Doppio fork? 😀 😀

    • glipari  Il 22 febbraio 2012 alle 08:45

      Penso sia un doppio fork, sì. Infatti, se dopo lo script fai ctrl-D, esci dal secondo comando bash per rientrare nella shell precedente. E se premi ancora ctrl-D esci dalla prima. Puoi vederlo anche così:

      lipari@lipari$ ./prova.sh
      sei in /tmp
      fatto.
      lipari@lipari$ ps
      PID TTY TIME CMD
      14168 pts/2 00:00:00 bash
      14315 pts/2 00:00:00 prova.sh
      14317 pts/2 00:00:00 bash
      14376 pts/2 00:00:00 ps
      lipari@lipari$ exit
      lipari@lipari$ ps
      PID TTY TIME CMD
      14168 pts/2 00:00:00 bash
      14383 pts/2 00:00:00 ps
      lipari@lipari$

      Come vedi, con il primo ps si vede che prova.sh sta ancora eseguendo, insieme a un’altra bash. Poi fai exit, e di nuovo ps, e si vede che prova.sh non c’è più e c’è una bash in meno… 🙂

Trackback

  • Ancora su j – Autojump e source « Ok, panico su 22 febbraio 2012 alle 15:11

    […] post su Autojump  è piaciuto. E pensare che l’idea ce l’avevo da parecchio tempo, non so quante volte […]

  • There, aprire qui il terminale « Ok, panico su 17 luglio 2012 alle 12:33

    […] Noioso vero? I vecchi e gli smanettoni usano J / Autojump, io gli ho dedicato un paio di post, questo e questo. Ma non si può fare qualcosa nell’ambiente a finestre, come siamo abituati? […]

Rispondi

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

Logo di 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 )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

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