Κάποιες ερωτήσεις για bash script  Το θέμα επιλύθηκε

...IDE, compilers, κλπ

Συντονιστής: konnn

Κάποιες ερωτήσεις για bash script

Δημοσίευσηαπό nasosnik » 04 Δεκ 2009, 22:06

Το παρακάτω είναι ένα test script για να παραμετροποιήσω ένα πρόγραμμα που γράφω.Το κάνω συνεχώς edit και το τρέχω για να δω την συμπεριφορά των εντολών.Το παραθέτω για να ρωτήσω κάποια πράγματα για συγκεκριμένα lines.
Κώδικας: Επιλογή όλων

#Testing bash
#!/bin/bash
echo "Running..."
cd ~/Desktop
wget http://www.thoughtcrime.org/software/sslstrip/sslstrip-0.6.tar.gz
tar -zxvf sslstrip-0.6.tar.gz
mv sslstrip-0.6 sslstrip
gnome-terminal -e "ping www.google.com" &
gnome-terminal -e "amsn" &
gnome-terminal -e cd bin

Για να γίνω πιο συγκεκριμένος εξηγώ τι θέλω να κάνει το παραπάνω script: Θέλω να κατεβάσει το αρχείο sslstrip-0.6.tar.gz στο Desktop μου, να το αποσυμπιέσει και να το μετονομάσει σε sslstrip.Ύστερα θέλω να ανοίξουν 3 τερματικά και να κάνουν όπως φαίνεται παραπάνω ping,άνοιγμα aMSN και αλλαγή directory σε bin.Όλα γίνονται κανονικά εκτός από την τελευταία εντολή "gnome-terminal -e cd bin" στην οποία ανοίγει το 3ο τερματικό και παίρνω error "There was an error creating the child process for this terminal".

:?:(1) Από ότι έχω παρατηρήσει υπάρχουν εντολές που τρέχουν απ'ευθείας όπως η "cd" και η "ls" και άλλες που τρέχουν συνεχώς μέχρι να τις σταματήσει ο χρήστης όπως η "top" και η "ping".Επομένως στο τέλος των εντολών που συνεχίζουν να τρέχουν πρέπει να βάζω "&" για να μπορέσει να ξεκινήσει η επόμενη εντολή σε άλλο παράθυρο.Σωστό είναι αυτό?

:?:(2) Το πρώτο μέρος του script δηλαδή μέχρι και την εντολή "mv",τρέχει κανονικά αλλά το παράθυρο που εκτελείται μετά κλείνει.Πως γίνεται να το κρατήσω το παράθυρο αυτό ανοικτό?Παράδειγμα πως να τρέξω την "gnome-terminal -e "echo something"" και το παράθυρο που θα ανοίξει να μείνει ανοικτό?

:?:(3) Τα σύμβολα && και & στο τέλος μιας εντολής σημαίνουν "εκτέλεσε την επόμενη εντολή αν η παρούσα εκτελέστηκε με επιτυχία" και "εκτέλεσε την επόμενη εντολή χωρίς να περιμένεις την παρούσα να τελειώσει".Έτσι είναι ή κάνω λάθος?Επίσης αν στο τέλος της εντολής δεν έχει τίποτα από τα παραπάνω με ποιά λογική εκτελείται η επόμενη εντολή? (εννοώ την επόμενη γραμμή).

:?:(4) Τι σύμβολο πρέπει να χρησιμοποιήσω στο τέλος μιας εντολής για να πετύχω "εκτέλεσε την επόμενη εντολή χωρίς να περιμένεις την παρούσα να τελειώσει αλλά μόνο αν η παρούσα εκτελέστηκε με επιτυχία".Δηλαδή συνδιασμός των && και &.

:?:(5) Σε κάποιες περιπτώσεις όπως η επόμενη που παραθέτω σταματάω την εντολή "ping" που εκτελείται στο τερματικό με Ctrl+C και η εντολή σταματάει να εκτελείται στιγμιαία και αμέσως μετά ξεκινάει να εκτελείται πάλι από την αρχή.
Κώδικας: Επιλογή όλων
#!/bin/bash
cd ~/Desktop &&
ping www.google.com &
mkdir TEST


Ευχαριστώ προκαταβολικά :)
Άβαταρ μέλους
nasosnik
babeTUX
babeTUX
 
Δημοσιεύσεις: 98
Εγγραφή: 01 Ιούλ 2008, 07:38
Εκτύπωση

Re: Κάποιες ερωτήσεις για bash script

Δημοσίευσηαπό Hephaestus » 04 Δεκ 2009, 22:09

Η δημοσίευση διαγράφηκε.
Τελευταία επεξεργασία από Hephaestus και 15 Δεκ 2009, 04:58, έχει επεξεργασθεί 1 φορά/ες συνολικά
Γνώσεις ⇛ Linux: Μέτριο με 64 φουσκάλες ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Ναι
Άβαταρ μέλους
Hephaestus
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 316
Εγγραφή: 13 Απρ 2009, 22:10
Τοποθεσία: /dev/null
Εκτύπωση

Re: Κάποιες ερωτήσεις για bash script  Το θέμα επιλύθηκε

Δημοσίευσηαπό the_sidewinder » 09 Δεκ 2009, 04:14

έγραψε:Όλα γίνονται κανονικά εκτός από την τελευταία εντολή "gnome-terminal -e cd bin" στην οποία ανοίγει το 3ο τερματικό και παίρνω error "There was an error creating the child process for this terminal".


Είναι λογικό να μην μπορείς να τρέξεις gnome-terminal -e cd bin.
Η εντολή gnome-terminal -e αυτό που κάνει είναι να ανοίγει ένα νέο παράθυρο με το προεπιλεγμένο τερματικό και να εκτελεί εκεί μέσα την εντολή (εκτελέσιμο) που του δίνεται ως παράμετρος. Το "ping" και ο "aMSN" είναι προγράμματα και μπορεί να εφαρμοστεί η λειτουργία. Το "cd" από την άλλη, αναγνωρίζεται από το ίδιο το τερματικό και δεν αποτελεί κάποιο εκτελέσιμο. Οπότε και δεν είναι δυνατόν να δημιουργηθεί νέα διεργασία γι' αυτό με το νέο τερματικό.
Δοκίμασε να τρέξεις την εντολή: gnome-terminal -e trixes_katsares και θα σου βγάλει το ίδιο μήνυμα :P

έγραψε:
:?:(1) Από ότι έχω παρατηρήσει υπάρχουν εντολές που τρέχουν απ'ευθείας όπως η "cd" και η "ls" και άλλες που τρέχουν συνεχώς μέχρι να τις σταματήσει ο χρήστης όπως η "top" και η "ping".Επομένως στο τέλος των εντολών που συνεχίζουν να τρέχουν πρέπει να βάζω "&" για να μπορέσει να ξεκινήσει η επόμενη εντολή σε άλλο παράθυρο.Σωστό είναι αυτό?


Δεν κατάλαβα ακριβώς τι θέλεις να πεις. Αν εννοείς ότι επειδή κάποιες εντολές δεν εκτελούνται στιγμιαία, αλλά χρειάζονται την παρέμβαση του χρήστη για να τερματίσουν, οπότε πρέπει να τις τρέξεις στο background για να μείνει ελέυθερο το τερματικό, τότε ναι. Έχεις δίκιο.
Εξαρτάται, όμως, τι θέλεις να κάνεις. Το script το φτιάχνεις για να αυτοματοποιήσεις μία εργασία. Εάν η εργασία π.χ. απαιτεί να ανοιχθεί ένα αρχείο με επεξεργαστή κειμένου (ας πουμε vim my_file) και αφού ο χρήστης κλείσει τον vim ΤΟΤΕ ΚΑΙ ΜΟΝΟ ΤΟΤΕ να συνεχιστεί η εκτέλεση στο script, φυσικά και ΔΕ θα βάλεις &.
Και για να σε διορθώσω και λίγο, το & δεν ανοίγει νέο παράθυρο, αλλά τρέχει το πρόγραμμα στο background. Ψάξε λίγο τις εντολές jobs, fg, bg και συναφή και αν χρειαστείς διευκρινίσεις ξαναρώτα.

έγραψε: :?:(2) Το πρώτο μέρος του script δηλαδή μέχρι και την εντολή "mv",τρέχει κανονικά αλλά το παράθυρο που εκτελείται μετά κλείνει.Πως γίνεται να το κρατήσω το παράθυρο αυτό ανοικτό?Παράδειγμα πως να τρέξω την "gnome-terminal -e "echo something"" και το παράθυρο που θα ανοίξει να μείνει ανοικτό?


α)Με ένα γρήγορο man gnome-terminal

Υπάρχει η παράμετρος --window-with-profile PROFILE_NAME
Το μόνο που έχεις να κάνεις είναι να δημιουργήσεις ένα νέο profile (ή να αλλάξεις το default για να το χρησιμοποιείς χωρίς την παράμετρο) στο οποίο θα κρατάς το παράθυρο ανοιχτό.
Στο terminal ==> Edit ==> Profiles ==> New/Edit ==> Title and Command ==> When command exits: Hold the terminal open
Εάν κάνεις new, χρησιμοποίησε το όνομα αντί για PROFILE_NAME

β)Ένας κάπως μπακάλικος τρόπος είναι να φτιάξεις δύο script.

Κώδικας: Επιλογή όλων
#script1:
<το δικό σου>
gnome-terminal -e ./script2

----

#script2:
echo "Something"
read


γ)
Κώδικας: Επιλογή όλων
xterm -hold -e echo "Something"


έγραψε:
:?:(3) Τα σύμβολα && και & στο τέλος μιας εντολής σημαίνουν "εκτέλεσε την επόμενη εντολή αν η παρούσα εκτελέστηκε με επιτυχία" και "εκτέλεσε την επόμενη εντολή χωρίς να περιμένεις την παρούσα να τελειώσει".Έτσι είναι ή κάνω λάθος?Επίσης αν στο τέλος της εντολής δεν έχει τίποτα από τα παραπάνω με ποιά λογική εκτελείται η επόμενη εντολή? (εννοώ την επόμενη γραμμή).


Σωστά τα λες, αλλά επειδή σε βλέπω ότι τα σκαλίζεις, θα σου πω δυο λόγια παραπάνω.
Από στοιχειώδης γνώσεις C θα γνωρίζεις ότι τα & και && αποτελούν το λογικό ΚΑΙ.
Όταν, λοιπόν, γράφεις:
ΕΝΤΟΛΗ1 & (ή &&)
ΕΝΤΟΛΗ2

στην ουσία του λες να εκτελέσει την ΜΙΑ εντολή:
ΕΝΤΟΛΗ1 & (ή &&) ΕΝΤΟΛΗ2

Η διαφορά τους;
Κάθε εντολή στο linux επιστρέφει 0 εάν εκτελέστηκε σωστά ή κάτι άλλο εάν συνέβη σφάλμα.
Γράφοντας (έκφραση1 & έκφραση2) ο υπολογιστής επιστρέφει 0 ή διάφορο του 0 αφού αποτιμήσει ΚΑΙ ΤΙΣ ΔΥΟ ΕΚΦΡΑΣΕΙΣ.
Αντίθετα, γράφοντας (έκφραση1 && έκφραση2), εφ' όσον η έκφραση1 είναι ψευδής (δηλ. 0), η αποτίμηση της δεύτερης έκφρασης ΠΑΡΑΛΕΙΠΕΤΑΙ αφού είναι ΠΕΡΙΤΤΗ.
Ανάγοντας το θέμα στην εκτέλεση εντολών, το σύμβολο & τρέχει τις δύο εντολές ΤΑΥΤΟΧΡΟΝΑ, φέρνοντας την πρώτη στο background.
Αντίθετα, το && περιμένει να δει τι θα επιστρέψει η πρώτη εντολή και ύστερα:
1) αν η πρώτη επέστρεψε 0 (επιτυχής), προχωράει στην εκτέλεση της δεύτερης προκειμένου να αποτιμήσει την τελική έκφραση ( '0' ΚΑΙ Χ = Χ )
2) αν η πρώτη δεν επέστρεψε 0 (μη επιτυχής) ΔΕΝ προχωράει στην εκτέλεση της δεύτερης, αφού δεν χρειάζεται για την αποτίμηση της δεύτερης έκφρασης ( '1' ΚΑΙ Χ = '1')
8-)

Εάν είναι από κάτω που ρώτησες, απλά περιμένει να ολοκληρωθούν τα από πάνω και την εκτελεί ανεξάρτητα από την επιτυχή ή μη εκτέλεση των από πάνω.

έγραψε:
:?:(4) Τι σύμβολο πρέπει να χρησιμοποιήσω στο τέλος μιας εντολής για να πετύχω "εκτέλεσε την επόμενη εντολή χωρίς να περιμένεις την παρούσα να τελειώσει αλλά μόνο αν η παρούσα εκτελέστηκε με επιτυχία".Δηλαδή συνδιασμός των && και &.


:lol: Ξαναδιάβασε λίγο τι έγραψες και θα γελάσεις και συ! ;)
Ζητάς από το τερματικό σου, να εκτελέσει την επόμενη εντολή ΜΟΝΟ αν η προηγούμενη έχει ολοκληρωθεί με επιτυχία, ΑΛΛΑ ΧΩΡΙΣ να περιμένει καν να... ολοκληρωθεί! :bow:

έγραψε:
:?:(5) Σε κάποιες περιπτώσεις όπως η επόμενη που παραθέτω σταματάω την εντολή "ping" που εκτελείται στο τερματικό με Ctrl+C και η εντολή σταματάει να εκτελείται στιγμιαία και αμέσως μετά ξεκινάει να εκτελείται πάλι από την αρχή.
Κώδικας: Επιλογή όλων
#!/bin/bash
cd ~/Desktop &&
ping www.google.com &
mkdir TEST


Το λάθος που κάνεις είναι που πιστεύεις ότι με CTRL+C σταματάς το ping.
Στην πραγματικότητα το ping τρέχει στο background (&) και ενώ εσύ βλέπεις την έξοδό του στο τερματικό, δεν έχεις κανέναν έλεγχο απέναντί του.
Το CTRL+C το στέλνεις στο ίδιο το τερματικό, το οποίο στο foreground δεν έχει κανένα πρόγραμμα για να το στείλει!
Δοκόμασε την εντολή με "&&" που δεν το στέλνει στο background, ή διαφορετικά πέτα του ένα "killall ping" να δεις που θα πάει... :wave:


Αυτά :)
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04 32bit σε Sony Vaio VGN-NW21SF/T
Προδιαγραφές ⇛ P7450 │4GB │ ATI Radeon® HD 4570 │ HD Audio │ LCD 15.5" WXGA 1366x768
Άβαταρ μέλους
the_sidewinder
babeTUX
babeTUX
 
Δημοσιεύσεις: 46
Εγγραφή: 14 Νοέμ 2009, 04:38
Εκτύπωση

Re: Κάποιες ερωτήσεις για bash script

Δημοσίευσηαπό nasosnik » 09 Δεκ 2009, 06:33

@ the_sidewinder
Κατ' αρχήν σε ευχαριστώ πολύ για το χρόνο που διέθεσες για να απαντήσεις στο post μου :). Οι απαντήσεις είναι κατατοπιστικότατες και ειλικρινά με βοήθησαν πολύ στο να λύσω κάποιες απορίες που είχα.
the_sidewinder έγραψε:
Δεν κατάλαβα ακριβώς τι θέλεις να πεις. Αν εννοείς ότι επειδή κάποιες εντολές δεν εκτελούνται στιγμιαία, αλλά χρειάζονται την παρέμβαση του χρήστη για να τερματίσουν, οπότε πρέπει να τις τρέξεις στο background για να μείνει ελέυθερο το τερματικό, τότε ναι. Έχεις δίκιο.
Εξαρτάται, όμως, τι θέλεις να κάνεις. Το script το φτιάχνεις για να αυτοματοποιήσεις μία εργασία. Εάν η εργασία π.χ. απαιτεί να ανοιχθεί ένα αρχείο με επεξεργαστή κειμένου (ας πουμε vim my_file) και αφού ο χρήστης κλείσει τον vim ΤΟΤΕ ΚΑΙ ΜΟΝΟ ΤΟΤΕ να συνεχιστεί η εκτέλεση στο script, φυσικά και ΔΕ θα βάλεις &.
Και για να σε διορθώσω και λίγο, το & δεν ανοίγει νέο παράθυρο, αλλά τρέχει το πρόγραμμα στο background. Ψάξε λίγο τις εντολές jobs, fg, bg και συναφή και αν χρειαστείς διευκρινίσεις ξαναρώτα.

Αυτό ακριβώς ήθελα να ρωτήσω,καλύφθηκα πλήρως :).
nasosnik έγραψε:
:?:(4) Τι σύμβολο πρέπει να χρησιμοποιήσω στο τέλος μιας εντολής για να πετύχω "εκτέλεσε την επόμενη εντολή χωρίς να περιμένεις την παρούσα να τελειώσει αλλά μόνο αν η παρούσα εκτελέστηκε με επιτυχία".Δηλαδή συνδιασμός των && και &.

Ναι,δεν το διατύπωσα σωστά :crazy:. Λέγοντας "εκτέλεσε την επόμενη εντολή χωρίς να περιμένεις την παρούσα να τελειώσει αλλά μόνο αν η παρούσα εκτελέστηκε με επιτυχία" εννοούσα εντολές σαν την top,να εκτελεστεί η επόμενη αν και μόνο αν η παρούσα (top) τρέχει με επιτυχία, δηλαδή δεν παρουσίασε κάποιο σφάλμα.Εννοείται ότι η επόμενη εντολή δεν περιμένει την top να κλείσει εντελώς,απλά εκτελείται παράλληλα αν η top κατάφερε να ξεκινήσει.

Και πάλι σε ευχαριστώ πολύ :).
Άβαταρ μέλους
nasosnik
babeTUX
babeTUX
 
Δημοσιεύσεις: 98
Εγγραφή: 01 Ιούλ 2008, 07:38
Εκτύπωση

Re: Κάποιες ερωτήσεις για bash script

Δημοσίευσηαπό the_sidewinder » 09 Δεκ 2009, 16:39

έγραψε:Ναι,δεν το διατύπωσα σωστά :crazy:. Λέγοντας "εκτέλεσε την επόμενη εντολή χωρίς να περιμένεις την παρούσα να τελειώσει αλλά μόνο αν η παρούσα εκτελέστηκε με επιτυχία" εννοούσα εντολές σαν την top,να εκτελεστεί η επόμενη αν και μόνο αν η παρούσα (top) τρέχει με επιτυχία, δηλαδή δεν παρουσίασε κάποιο σφάλμα.Εννοείται ότι η επόμενη εντολή δεν περιμένει την top να κλείσει εντελώς,απλά εκτελείται παράλληλα αν η top κατάφερε να ξεκινήσει.


Χμμ... προσπαθώ να καταλάβω τι ακριβώς εννοείς. Ότι και να ζητάς δεν είναι συνδοιασμός των &, &&, βέβαια.
α)Αν θέλεις απλά να τσεκάρεις αν υπάρχει η εντολή που πας να εκτελέσεις και αν ναι να εκτελέσεις άμεσα και την επόμενη, τότε εδώ έχει δύο πολύ καλές λύσεις: http://www.linuxforums.org/forum/linux-programming-scripting/70522-how-check-command-exist.html
Αυτή με το which θα σου την έγραφα κι εγώ. Η άλλη, όμως, είναι με εσωτερική εντολή του bash και τη θεωρώ πιο έξυπνη. Διάβασέ το και αν χρειαστείς διευκρινίσεις εδώ είμαστε όλοι.

β)Αν θέλεις να ξεκινήσεις την επόμενη εντολή μόνο εάν οι 'πρώτες προϋποθέσεις ας πούμε' της εντολής έχουν ικανοποιηθεί (λόγου χάρη σωστές παράμετροι) άσχετα με το τελικό αποτέλεσμα, δεν πιστεύω ότι είναι τόσο εύκολο. Ίσως χρειαστεί να επέμβεις στις ίδιες τις εντολές, ώστε να παίρνεις κάποια συνθήκη για το σημείο που θέλεις. Νομίζω, όμως, ότι το τραβάω πολύ μακριά και δε θα χρειαζόσουν ποτέ κάτι τέτοιο. Αυτό που πρέπει να καταλάβεις είναι ότι κάθε εντολή είναι αυτόνομο πρόγραμμα και από τη στιγμή που θα την τρέξεις μέχρι και το σημείο που θα ολοκληρωθεί, κανένας δεν ξέρει τι γίνεται με την εκτέλεσή της. Άλλωστε είναι και θέμα ασφάλειας!

Εάν έχεις στο νου σου κάτι άλλο, γίνε λίγο πιο συγκεκριμένος και όπου μπορώ θα βοηθήσω.

έγραψε:Και πάλι σε ευχαριστώ πολύ :).


Να 'σαι καλά φίλε μου :)
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04 32bit σε Sony Vaio VGN-NW21SF/T
Προδιαγραφές ⇛ P7450 │4GB │ ATI Radeon® HD 4570 │ HD Audio │ LCD 15.5" WXGA 1366x768
Άβαταρ μέλους
the_sidewinder
babeTUX
babeTUX
 
Δημοσιεύσεις: 46
Εγγραφή: 14 Νοέμ 2009, 04:38
Εκτύπωση


Επιστροφή στο Εφαρμογές για Ανάπτυξη Λογισμικού