Τα πάντα για το Bash...

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

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

Re: Τα πάντα για το Bash...

Δημοσίευσηαπό Ilias95 » 05 Ιουν 2014, 02:53

@malos
Πιστεύω πως μπορώ να βοηθήσω αλλά πραγματικά δεν καταλαβαίνω τι θέλεις να κάνεις.
Μπορείς να επαναδιατυπώσεις το πρόβλημα πιο καθαρά;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για το Bash...

Δημοσίευσηαπό malos » 05 Ιουν 2014, 11:57

Έχω σε ένα φάκελο κάποια σκριπτ. 20 συγκεκριμένα. Είναι σε ζευγάρια. Έχουν ονόματα από μέρη του σπιτιού με τις λέξεις ΠΑΝΩ ή ΚΑΤΩ.
Δηλαδή : TRAPEZI ΠΑΝΩ, TRAPEZI ΚΑΤΩ, DOMATIO ΠΑΝΩ, DOMATIO ΚΑΤΩ, NTOYLAPI ΠΑΝΩ, NTOYLAPI ΚΑΤΩ κλπ.
Υπάρχει λόγος που είναι λατινικοί οι χαρακτήρες της πρώτης λέξεις και ελληνικοί οι δεύτεροι για τα πανω κάτω.
Αυτά είναι λοιπόν τα ονόματα των σεναρίων σε κάποιον φάκελο και τρέχουν μια χαρά όταν τα θέλω.

Θέλω κάποια στιγμή να μπορώ να τα αλλάξω και εκεί που τρέχει το .....ΚΑΤΩ, με ένα κλικ σε κάποιο σκριπτ (αυτό που προσπαθώ να φτιάξω)
να τρέξει το αντίστοιχο ΠΑΝΩ.
Δηλαδή τρέχει το DOMATIO ΚΑΤΩ, κάνω κλικ και εκτελείται το DOMATIO ΠΑΝΩ.

Ο τρόπος που σκέφτηκα είναι να βρίσκει το σκριπτ με χρήση της ps -A αν τρέχει κάποιο από αυτά τα σκριπτς και ποιο. Άλλωστε όταν τρέχει ένα από τα 20 αποκλείεται να τρέχει κάποιο από τα υπόλοιπα 19, είναι υπολογισμένο αυτό.
Απλά το σκριπτ να ξέρει ποιο "μέρος του σπιτιού" να τρέξει. Αν ας πούμε τρέχει το TRAPEZI ΚΑΤΩ, με το κλικ να τρέξει το TRAPEZI ΠΑΝΩ και όχι κάποιο άλλο. Αν τρέχει το DOMATIO ΚΑΤΩ, με το κλικ να τρέξει το DOMATIO ΠΑΝΩ.

Γι αυτό νομίζω ότι η ps -A είναι η καταλληλότερη. Τα υπόλοιπα νομίζω ότι πρέπει να είναι με τη sed. Να αφαιρεθουν οι αριθμοί από τη γραμμή της ps -A και να γίνει κάποια αντικαταστάση κειμένου στη λέξη ΚΑΤΩ και να γίνει ΠΑΝΩ. ΝΑ προστεθεί το σύμβολο \ μετά την πρώτη λέξη
για να μην υπάρχει κενό ως διεύθυνση όταν θα λες: exec DOMATIO ΠΑΝΩ ή ./DOMATIO ΠΑΝΩ αλλά να είναι

./DOMATIO\ ΠΑΝΩ.

Κάπως έτσι το σκέφτηκα:

Κώδικας: Επιλογή όλων
#!/bin/bash
if trexon_senario=$ ps -A | grep ΚΑ | sed  's/[^ ][^ ]*//' | sed  's/[^ ][^ ]*//' | sed  's/[^ ][^ ]*//' | sed 's/          //' | sed 's/ΚΑ?/ΠΑΝΩ/' | sed 's/[a-zA-Z]\+A/&\\/'


then echo $trexon
else echo "Δεν τρέχει τίποτα"
fi


Το συκεκριμένο λέει echo για δοκιμαστικούς λόγους όπως καταλαβαίνεις. Αντί για echo όμως αν του πω exec h ./ μου λέει
Κώδικας: Επιλογή όλων
./αλλαγή: γραμμή 5: ./: Είναι κατάλογος

(αλλαγή) είναι το όνομα του σκριπτ που προσπαθώ.

Δες τι δίνει και η ps

Κώδικας: Επιλογή όλων
malos@malos:~/scripts/ΣΠΙΤΙ$ ps -A
  PID TTY          TIME CMD
    1 ?        00:00:01 init
    2 ?        00:00:00 kthreadd
    3 ?        00:00:06 ksoftirqd/0
..........................................................
.........................................................
.............................................................
25128 ?        00:00:00 ΔΟΜΑΤΙΟ ΚΑ?
............................................................


και η

Κώδικας: Επιλογή όλων
malos@malos:~/scripts/ΣΠΙΤΙ$ ps -A | grep ΚΑ | sed  's/[^ ][^ ]*//' | sed  's/[^ ][^ ]*//' | sed  's/[^ ][^ ]*//' | sed 's/          //' | sed 's/ΚΑ?/ΠΑΝΩ/' | sed 's/[a-zA-Z]\+A/&\\/'

DOMATIO\ ΠΑΝΩ


Βλέπεις; Καταφέρνω να παράγω τις λέξεις που θέλω (DOMATIO\ ΠΑΝΩ) αλλά δεν τρέχει μετά όπως το θέλω με exec. Και δεύτερον άντε και να έτρεχε,
δεν είναι σωστός τροπος έτσι. Αλλιώς πρέπει μάλλον να αφαιρέσω τα κενά και τους αριθμούς από αυτό: 25128 ? 00:00:00 ΔΟΜΑΤΙΟ ΚΑ?

Αλλά ζήτησα μόνο αυτό για να μην ζητάω ολόκληρο το σκριπτ έτοιμο. Μην με πεις και τεμπέλη! :lol:
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1230
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: Τα πάντα για το Bash...

Δημοσίευσηαπό Ilias95 » 05 Ιουν 2014, 17:18

Αν λοιπόν κατάλαβα καλά, πάντα θα τρέχει ένα εκ των TRAPEZI Π/Κ, DOMATIO Π/Κ, NTOYLAPI Π/Κ και εσύ απλά θες να βρίσκεις ποιο απ' αυτά τρέχει και να τρέχεις το «αντίθετο» του. Σωστά; Αν ναι, πολύ το κουράζεις με το sed.

Κώδικας: Επιλογή όλων
#!/bin/bash

line=`ps -A | egrep "(DOMATIO|NTOULAPI|TRAPEZI)"`
if (($? == 0)); then # if egrep matched
   prefix=`echo "$line" | sed -r 's/^.*(DOMATIO|NTOULAPI|TRAPEZI).*$/\1/'`
   if echo "$line" | rev | cut -d' ' -f1 | grep Κ >/dev/null; then #ΚΑΤΩ running, greek K
      suffix="ΠΑΝΩ"
   else
      suffix="ΚΑΤΩ"
   fi
   echo "$prefix"
   echo "$suffix"
   echo "$prefix $suffix"
   #./"$prefix $suffix" #execute reverse script
fi

Πάμε να το δούμε λοιπόν σιγά, σιγά.
Αρχικά προσπαθώ να κάνω match μία γραμμή που περιέχει μέσα την λέξη DOMATIO ή τη λέξη NTOULAPI ή τη λέξη TRAPEZI. Αν βρεθεί τέτοια γραμμή (το $? περιέχει τον κωδικό εξόδου της τελευταίας εντολής και αν αυτός είναι 0 σημαίνει ότι είχαμε match) τότε κρατάω με τον sed την λέξη DOMATIO ή NTOULAPI ή TRAPEZI. Το regex που χρησιμοποιώ λέει, βρες την αρχή γραμμής, μετά οσουσδήποτε ότι να 'ναι χαρακτήρες μετά μια απ' τις λέξεις που θέλουμε, ξανά οσουσδήποτε ότι να 'ναι χαρακτήρες και μετά το τέλος γραμμής. Όλο αυτό αντικατέστησε το με τη λέξη που θέλαμε. Το \1 είναι back referencing και αντιστοιχεί σε αυτό που κάναμε match και ήταν μέσα σε παρενθέσεις.

Πρόσεξε ότι χρησιμοποιώ την egrep γιατί θέλω τα extended regex. Το ίδιο μπορώ να πετύχω και με grep -e. Το -r στον sed λέει επίσης να χρησιμοποιηθούν extended regex.

Ωραία, τώρα έχουμε το μέρος του σπιτιού και μένει να βρούμε αν τρέχει το ΠΑΝΩ ή το ΚΑΤΩ για να τρέξουμε το άλλο.
Αρχικά αντιστρέφω την γραμμή με την rev. Πχ:
Κώδικας: Επιλογή όλων
ilias@archpc ~  ➜ echo "25128 ?        00:00:00 ΔΟΜΑΤΙΟ ΚΑ?" | rev
?ΑΚ ΟΙΤΑΜΟΔ 00:00:00        ? 82152

Μετά με την cut παίρνω την πρώτη στήλη:
Κώδικας: Επιλογή όλων
ilias@archpc ~  ➜ echo "25128 ?        00:00:00 ΔΟΜΑΤΙΟ ΚΑ?" | rev | cut -d' ' -f1
?ΑΚ

Το -d ορίζει τον delimeter (διαχωριστικός χαρακτήρας) των στηλών που θέλω να είναι το κενό και το -f1 επιστρέφει την πρώτη στήλη.

Μετά απλά ελέγχω αν το Κ περιέχεται σ' αυτό που έμεινε. Αν ναι τότε θέλουμε να τρέξουμε το ΠΑΝΩ, αλλιώς το αντίθετο. Μάλιστα ελέγχω μόνο το Κ και όχι τίποτα περισσότερο επειδή το script δεν εμφανίζεται πάντα ίδιο στην ps -A. Πχ. ενώ εσένα στο δείχνει DOMATIO ΚΑ? εμένα μου το δείχνει σαν DOMATIO ΚΑΤ?

Τέλος αρκεί να το τρέξω με ./"$prefix $suffix". Όπως βλέπεις αν το βάλεις μέσα σε εισαγωγικά δεν χρειάζεται τις ανάποδες κάθετους που έλεγες.

Hope it helps! :)
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για το Bash...

Δημοσίευσηαπό malos » 05 Ιουν 2014, 22:16

Ηλία!

Είσαι αστέρι ρε φίλε. Δεν το λέω κοινότυπα. Εκτός από το γεγονός ότι δουλέυει άψογα αυτό που μου χάρισες,
έκατσες και τα εξήγησες. Και τη λογική και τη μαστοριά και λίγο από θεωρία και επεξήγηση των εντολών.
Σου είμαι ευγνώμων. Σε θαυμάζω τέλος, όχι επειδή ξέρεις τις εντολές απλά, αλλά επειδή ξέρεις να εξηγείς και κυρίως εεπιδή έχεις διάθεση να το κάνεις.

Σ' ευχαριστώ πολύ.

Υ.Γ. Ώστε η rev αντιστρέφει και το άλλο που μου άρεσε.... το $0 περιέχει τον κωδικό εξόδου της τελευταίας εντολής .
Φαντάζεσαι απλά αν μου έδινες σκέτο το script; Τώρα καθομαι και παίζω στην κονσόλα διάφορα πράγματα που να περιέχουν αυτά που είπες. Έτσι μαθαίνει κανείς. Γι αυτό και το κούραζα με το sed. Βρήκα κάποια πράγματα για το sed και έπαιξα όσο μπορoύσα. Κάτι μου έμεινε. Τώρα έχω και καινούργια πράγματα. Είδες ρε φίλε τι είναι να το επικοινωνείς με άνθρωπο παρά να διαβάζεις διάφορα pdf που κυκλοφορούν;
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1230
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: Τα πάντα για το Bash...

Δημοσίευσηαπό Ilias95 » 06 Ιουν 2014, 22:44

Κάτι ακόμα. Δοκίμασε καλύτερα να χρησιμοποιήσεις την ps με άλλα ορίσματα απ' το -A γιατί έτσι όπως είναι όπως είδες δεν επιστρέφει ολόκληρο το όνομα της εντολής που εκτελέστηκε. Αν πχ. στο μέλλον βάλεις και ένα script που να λέγεται TERASTIAONOMATARA ΠΑΝΩ, το script πιθανόν να μην δουλεύει γιατί η ps θα επιστρέφει μόνο "TERASTIAONOMAT".

Με ps aux ή ps -ef πχ. επιστρέφεται το πλήρες όνομα αλλά υπάρχει άλλο πρόβλημα.
Κώδικας: Επιλογή όλων
ilias@archpc ~  ➜ ps aux | grep triapoylakiakathontan
ilias     8792  0.0  0.0  11192  1100 pts/4    S+   22:34   0:00 grep triapoylakiakathontan
                                                                                                                                                             
ilias@archpc ~  ➜


Επειδή όταν χρησιμοποιείς piping οι εντολές εκτελούνται παράλληλα όπως βλέπεις η grep κάνει match την διεργασία που αφορά τον εαυτό της οπότε δεν ξέρουμε αν έκανε match την διεργασία "./NTOULAPI KATW" ή την διεργασία "grep (DOMATIO|NTOULAPI)". Θα πρέπει να προστεθούν έξτρα έλεγχοι για το τι επιστρέφει.

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

PS.
Ευχαριστώ για τα καλά σου λόγια, χαίρομαι που δουλεύει και που καταλαβαίνεις και πως επίσης.
Κι εγώ τώρα τελευταία άρχισα να ασχολούμαι περισσότερο με bash scripting λόγω σχολής κυρίως και έμαθα πολλά ενδιαφέροντα πράγματα. Αν θες ρίξε μια ματιά στις διαφάνειες απ' τις οποίες γίνεται το μάθημα σε μας. Καλύπτουν πολλά είναι αναλυτικές και περιεκτικές και έχουν πολλά παραδείγματα που σε βοηθάνε να κατανοήσεις ότι αναλύει σε βάθος. Προσωπικά τις βρίσκω εξαιρετικές: https://sites.google.com/site/it4202teithegr/theoria
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για το Bash...

Δημοσίευσηαπό malos » 07 Ιουν 2014, 17:29

Ευχαριστώ πολύ. Για τα πρώτα που είπες αλλά και για το υλικό. Είναι καλογραμμένο και καλοδουλεμένο.
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1230
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: Τα πάντα για το Bash...

Δημοσίευσηαπό Ilias95 » 11 Ιουν 2014, 19:23

Μια απορία.
Το ~/mplampla θεωρείται absolute path; (δεν νομίζω)

Προσωπικά έχω την εντύπωση ότι absolute path μπορούμε να θεωρήσουμε μόνο ότι ξεκινάει από την /.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για το Bash...

Δημοσίευσηαπό fkol k4 » 11 Ιουν 2014, 22:16

Ilias95 έγραψε:Μια απορία.
Το ~/mplampla θεωρείται absolute path; (δεν νομίζω)

Προσωπικά έχω την εντύπωση ότι absolute path μπορούμε να θεωρήσουμε μόνο ότι ξεκινάει από την /.

Πολύ σωστά Ηλία.

Το ~/mplampla είναι relative path και εξαρτάται από τον χρήστη που το δίνει. Πχ το
Κώδικας: Επιλογή όλων
su -c 'cp foo ~/foo'
θα έχει το
Κώδικας: Επιλογή όλων
/root/foo
ως αποτέλεσμα, ενώ το
Κώδικας: Επιλογή όλων
cp foo ~/foo
δοσμένο από εμένα, θα έχει το
Κώδικας: Επιλογή όλων
/home/fkol-k4/foo


Όντως, absolute path είναι μόνο ότι ξεκινάει από την / .
Γνώσεις: Linux: ★★★☆☆ Προγραμματισμός: ★☆☆☆☆ Αγγλικά: ★★★★★
Η υπογραφή μου
Οδηγίες για αρχάριους στο Ubuntu (12.04 LTS)Οδηγοί του forum
Άβαταρ μέλους
fkol k4
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4829
Εγγραφή: 28 Φεβ 2011, 22:56
Τοποθεσία: Αθήνα
Launchpad: fkol-k4
IRC: fkol_k4
Εκτύπωση

Re: Τα πάντα για το Bash...

Δημοσίευσηαπό Ilias95 » 11 Ιουν 2014, 23:09

@fkolk4
Τελικά ψάχνοντας το λίγο παραπάνω είδα ότι οι απόψεις είναι αντικρουόμενες.
Ρίξε αν θες μια ματιά σ' αυτή την απάντηση: http://www.insomnia.gr/topic/248261-inf ... ry53252987

Όπως αναφέρω και εκεί σε σημειώσεις μαθήματος μου για λειτουργικά το αναφέρει σαν absolute.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για το Bash...

Δημοσίευσηαπό fkol k4 » 12 Ιουν 2014, 00:15

Το freedesktop.org πάντως συμφωνεί μαζί μου.

Έχω ένα script στο ~/.local/bin που το χρησιμοποιώ για αυτόματο συγχρονισμό (zsync) των εικόνων για την 14.10. Το script το χρησιμοποιώ συχνά, οπότε είναι σίγουρο πως λειτουργεί.
Οπότε, έφτιαξα άλλον έναν εκκινητή (αρχείο .desktop) γι αυτό, λλά αυτή τη φορά έβαλα τα στοιχεία με ~ και $HOME.

Όπως φαίνεται, δεν εμφανίζεται το εικονίδιο του εκκινητή.
Κάνοντας διπλό κλικ στον εκκινητή (φυσικά είναι εκτελέσιμος), παίρνω το παρακάτω:

Αλλάζοντας τα ~/ και $HOME σε /home/fkol-k4, το εικονίδιο του εκκινητή εμφανίζεται κανονικά

και το script ανοίγει κανονικά επίσης.
Γνώσεις: Linux: ★★★☆☆ Προγραμματισμός: ★☆☆☆☆ Αγγλικά: ★★★★★
Η υπογραφή μου
Οδηγίες για αρχάριους στο Ubuntu (12.04 LTS)Οδηγοί του forum
Άβαταρ μέλους
fkol k4
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4829
Εγγραφή: 28 Φεβ 2011, 22:56
Τοποθεσία: Αθήνα
Launchpad: fkol-k4
IRC: fkol_k4
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι