Problema eseguire piping da linea di comando

9 risposte [Ultimo contenuto]
Ritratto di entropic
entropic
(Junior)
Offline
Junior
Iscritto: 02/12/2017
Messaggi: 7

Salve metto subito le mani avanti dicendo che sto ancora "studiando" linux da una guida online e mi sono imbattuto in un problema con il piping |

Dunque sono in ~/Documenti/Programmazione/Java2017 e voglio creare un file chiamato Increase.java nella directory TestVariables già creata.

Scrivo a linea di comando
cd TestVariables | gedit Increase.java

mi aspetto che si muova nella directory e lì dentro crei il file.Invece non cambia directory però esegue la seconda parte del comando e mi crea il file .java in Java2017.

bios-hock@debian:~/Documenti/Programmazione/Java2017$  cd TestVariables | gedit Increase.java
bios-hock@debian:~/Documenti/Programmazione/Java2017$ cd TestVariables
bios-hock@debian:~/Documenti/Programmazione/Java2017/TestVariables$ 
bios-hock@debian:~/Documenti/Programmazione/Java2017/TestVariables$ ls -a
.  ..

Sbaglio qualcosa di sicuramente banale e stupido ma non riesco proprio a vederlo, c'è qualcuno che ha la pazienza di farmi capire l'errore?
Grazie

Ritratto di franz
franz
(Collaboratore)
Offline
Collaboratore
Iscritto: 21/12/2005
Messaggi: 423

Ciao.
Il pipe riceve l'output del comando di sx e lo passa al comando di dx.
Per fare quello che vuoi tu, in bash, che sappia io, ci sono due possiblita`:

cd TestVariables && gedit Increase.java
cd TestVariables ; gedit Increase.java
In pratica, i comandi vengono eseguiti in sequenza.
Non conosco bene la differenza tra le due sintassi, ma il risultato, almeno in questo caso, e` lo stesso. Big Grin
HTH

There are only 10 types of people in the world: those who understand binary and those who don't.

Ritratto di entropic
entropic
(Junior)
Offline
Junior
Iscritto: 02/12/2017
Messaggi: 7

Ciao franz ,

Per quello che so && esegue il comando solo se quello che sta a sx restituisce un valore interpretabile come "true", mentre il ; esegue e basta ed infatti pensavo fosse identico a | .

Ma invece come suggerisci tu con ; funziona e con | no ,grazie mille!

Ritratto di badroot
badroot
(Guru)
Offline
Guru
Iscritto: 22/08/2008
Messaggi: 2059

franz ha scritto:

Non conosco bene la differenza tra le due sintassi, ma il risultato, almeno in questo caso, e` lo stesso.

Se ben ricordo l'utilizzo di && sta a significare di eseguire il comando sulla destra solo se quello a sinistra ha ritornato 0 come esito, di contro il ";" separa l'esecuzione dei comandi senza nessun controllo.

Per es :

cd ~/temp && touch pippo.txt

indica di andare nella cartella temp della propria home directory e solo se questa esiste creare il file pippo.txt, il comando cd ritorna 0 se termina con successo, ossia esiste la directory in cui muoversi.

EDIT

Battuto sul tempo Big Grin

Ritratto di entropic
entropic
(Junior)
Offline
Junior
Iscritto: 02/12/2017
Messaggi: 7

Badroot

Citazione:

Battuto sul tempo

forse sì ma tu sei stato più preciso di me.

Ad ogni modo vedo che abbiamo tutti un po' la stessa concezione solo mi chiedo perchè | non esegue il change directory però crea la seconda parte del comando ?
; invece fa tutte e due le cose.

boh! Comunque grazie !

Ritratto di homeless
homeless
(Guru)
Offline
Guru
Iscritto: 21/10/2011
Messaggi: 1297

entropic ha scritto:

Ad ogni modo vedo che abbiamo tutti un po' la stessa concezione solo mi chiedo perchè | non esegue il change directory però crea la seconda parte del comando ? ; invece fa tutte e due le cose. boh!


Perchè ogni comando in una pipeline è eseguito come un processo separato (cioè in una subshell).

Ritratto di mcortese
mcortese
(Moderatore)
Offline
Moderatore
Iscritto: 27/02/2009
Messaggi: 2918

Un bell'esercizio per capire come funzionano | e ; è analizzare il "tar pipe":

( cd DIRECTORY1 ; tar cf - . ) | ( cd DIRECTORY2 ; tar xf - )
(a volte la si trova anche con && invece di ; ma il principio è lo stesso)

La spiegazione è qui.

Ritratto di entropic
entropic
(Junior)
Offline
Junior
Iscritto: 02/12/2017
Messaggi: 7

mcortese, mi scuso per la tardiva risposta ma tra impegni e catastrofiche influenze non ho potuto replicare prima.

Ho letto la tua spiegazione , e se ho capito bene il | serve per i flussi di dati mentre il ; è più simile ad un fai questo + quest'altra cosa.

p.s. approfitto per chiedere se qualcuno conosce un Linux club a Milano che accolga anche principianti

Grazie mille per la spiegazione.

A

Ritratto di kripsio
kripsio
(Collaboratore)
Offline
Collaboratore
Iscritto: 10/09/2004
Messaggi: 1511

Si usa ancora l'espressione RTFM? Big Grin o nel tempo dei social network si è tutti diventati "polite" perché lo sport nazionale della polemica è sempre dietro l'angolo? hihiih Big Grin

[ ENJOY!! ]
https://www.tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf

CiaOOoo Smile

Ritratto di mcortese
mcortese
(Moderatore)
Offline
Moderatore
Iscritto: 27/02/2009
Messaggi: 2918

Sì è proprio così. Se la vita vera fosse comandabile tramite Bash, vedremmo situazioni come queste.

compra zucchero ; compra latte
# prima uno poi l'altro
 
compra zucchero && prepara torta
# il secondo solo se il primo ha avuto successo
 
compra zucchero || compra miele
# il secondo se il primo non ha avuto successo
 
sbatti uova & scalda forno
# le due cose in parallelo
 
impasta | inforna
# l'output del primo va al secondo, concettualmente simile a:
impasta >teglia
inforna <teglia
# ma nel primo caso i due processi sono in parallelo come in catena di montaggio