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

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

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

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

Δημοσίευσηαπό pros » 08 Απρ 2012, 12:40

Ilias95 έγραψε:Still missing. :problem:

Δημιουργείται μόνο όταν προσθέσεις κάποια λέξη στον ορθογράφο, με δεξί κλικ «Προσθήκη στο λεξικό»
10.04 / 12.04 64bit
Άβαταρ μέλους
pros
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3534
Εγγραφή: 28 Ιαν 2009, 22:28
IRC: sterios
Εκτύπωση

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

Δημοσίευσηαπό fkol k4 » 08 Απρ 2012, 12:55

pros έγραψε:
Κώδικας: Επιλογή όλων
cat όλα τα persdict.dat όλων συστημάτων | sort | uniq > tmp_perdict.dat προορισμού

Στην συνέχεια rm to perdict.dat προορισμού και αντικατάσταση με το ενημερωμένο...
Αυτό δουλεύει άψογα.

Με >> προσθέτεις στο περιεχόμενο ενός αρχείου, με > αντικαθιστάς το περιεχόμενο του...

Σ' ευχαριστώ πολύ για τη βοήθεια. Αυτό που με μπερδεύει είναι το "tmp_". Έχει να κάνει με το φάκελο /tmp του συστήματος ή με κάτι προσωρινό (για παράδειγμα το persdict.dat που έχει φορτωθεί στη μνήμη) ή είναι πρόθεμα για την εντολή; (sorry που σε πρήζω...)
Ilias95 έγραψε:Still missing.

Μάλλον θα δημιουργείται όταν προσθέσεις κάτι.
Η μορφή του πάντως (πληροφοριακά καθαρά) είναι:
Κώδικας: Επιλογή όλων
λέξη1
λέξη2
λέξη3
...
λέξηΧ

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

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

Δημοσίευσηαπό pros » 08 Απρ 2012, 12:59

fkol k4 έγραψε:Αυτό που με μπερδεύει είναι το "tmp_".

Το όνομα του αρχείου είναι (μπορείς να βάλεις οτιδήποτε). Δεν έχει καμία σχέση με την εντολή...
10.04 / 12.04 64bit
Άβαταρ μέλους
pros
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3534
Εγγραφή: 28 Ιαν 2009, 22:28
IRC: sterios
Εκτύπωση

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

Δημοσίευσηαπό fkol k4 » 08 Απρ 2012, 13:22

pros έγραψε:
fkol k4 έγραψε:Αυτό που με μπερδεύει είναι το "tmp_".

Το όνομα του αρχείου είναι (μπορείς να βάλεις οτιδήποτε). Δεν έχει καμία σχέση με την εντολή...

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

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

Δημοσίευσηαπό evolgen » 25 Μάιος 2012, 23:06

Έχω γράψει ένα script σε bash, το οποίο κατεβάζει βάσεις δεδομένων (ακόμα και συμπιεσμένες φτάνουν τα 10 Gigabytes). Αυτό το script μπορεί να αποτύχει να εκτελεστεί σωστά σε διάφορα σημεία, γιατί μπορεί να τύχει την ώρα που κατεβάζω μια από τις βάσεις με το wget, να ανεβεί στο server η νεότερη έκδοσή της και να αποτύχει το κατέβασμα. Οι βάσεις αυτές ανανεώνονται κάθε μέρα σε μη αυστηρά καθορισμένη στιγμή.

Αυτό που θα ήθελα είναι το script να ξανακαλεί τον εαυτό του, σε όποιο σημείο και αν αποτύχει, από το πρώτο βήμα ως και το τελευταίο. Πώς μπορώ να το κάνω αυτό;
Το να μειώνεις ένα έργο ελεύθερου λογισμικού, επειδή θεωρείς το δικό σου καλύτερο,
είναι απαράδεκτη συμπεριφορά και δε συμβαδίζει με τις αρχές του ελεύθερου λογισμικού.

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

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

Δημοσίευσηαπό simosx » 25 Μάιος 2012, 23:59

evolgen έγραψε:Έχω γράψει ένα script σε bash, το οποίο κατεβάζει βάσεις δεδομένων (ακόμα και συμπιεσμένες φτάνουν τα 10 Gigabytes). Αυτό το script μπορεί να αποτύχει να εκτελεστεί σωστά σε διάφορα σημεία, γιατί μπορεί να τύχει την ώρα που κατεβάζω μια από τις βάσεις με το wget, να ανεβεί στο server η νεότερη έκδοσή της και να αποτύχει το κατέβασμα. Οι βάσεις αυτές ανανεώνονται κάθε μέρα σε μη αυστηρά καθορισμένη στιγμή.

Αυτό που θα ήθελα είναι το script να ξανακαλεί τον εαυτό του, σε όποιο σημείο και αν αποτύχει, από το πρώτο βήμα ως και το τελευταίο. Πώς μπορώ να το κάνω αυτό;


Μπορείς να χρησιμοποιήσεις συναρτήσεις στο Bash ώστε μια συνάρτηση να παρακολουθεί τη λήψη, και αν συμβεί κάτι, να προσπαθεί να επαναλάβει τη λήψη.
Δηλαδή, θα έχεις μια συνάρτηση «download_file()» που θα καλείται για να κάνει τη λήψη. Και μόλις ολοκληρωθεί η συνάρτηση, η καλούσα θα δει αν το αρχείο είναι εντάξει ή όχι (οπότε τότε θα επαναλαμβάνει η λήψη).

Γενικά, είναι πιο εύκολο να κάνεις μια τέτοια δουλειά με π.χ. Python. Μπορείς να διαβάζεις την ημερομηνία του αρχείου, και να διαπιστώνεις αν ένα αρχείο έχει αλλάξει. Ρώτησε αν θέλεις βοήθεια με Python.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

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

Δημοσίευσηαπό medigeek » 26 Μάιος 2012, 18:11

Το $? είναι variable που δίνει το exit status μιας εντολής.
Αν είναι 0, η εντολή εκτελέστηκε σωστά, αν είναι οποιοσδήποτε άλλος αριθμός, υπήρξε σφάλμα.

Το $? μπορείς να το ελέγξεις μόνο αμέσως μετά την εντολή (ή μπορείς να το φυλάξεις σε variable). Αν εκτελεστεί άλλη εντολή, το $? θα αλλάξει.

Παράδειγμα:
έγραψε:$ wget "http://fakedomain.gr" -O -; echo $?
--2012-05-26 16:50:38-- http://fakedomain.gr/
Resolving fakedomain.gr (fakedomain.gr)... failed: Name or service not known.
wget: unable to resolve host address `fakedomain.gr'
4

$ wget "http://google.com/index.test" -O -; echo $?
--2012-05-26 16:51:27-- http://google.com/index.test
Resolving google.com (google.com)... 173.194.39.160, 173.194.39.161, 173.194.39.162, ...
Connecting to google.com (google.com)|173.194.39.160|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://www.google.com/index.test [following]
--2012-05-26 16:51:27-- http://www.google.com/index.test
Resolving http://www.google.com (http://www.google.com)... 173.194.35.180, 173.194.35.176, 173.194.35.177, ...
Connecting to http://www.google.com (http://www.google.com)|173.194.35.180|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2012-05-26 16:51:27 ERROR 404: Not Found.

8

Το 4 και το 8 είναι το $?

Παραδείγματα ως script:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#!/bin/bash
wget -q "http://google.com/index.test"
wgetstatus="$?"

if [ $wgetstatus -eq 0 ]; then
echo "Success"
else
echo "Something went wrong"
fi


Αν θες να κατεβάζει επ' άπειρον μέχρι η λήψη να γίνει σωστά:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#!/bin/bash
# Download
wgetstatus="999"
while [ "$wgetstatus" -ne "0" ]; do
echo "Downloading file"
wget -q "http://google.com/index.test" -O myfile.test
wgetstatus="$?"
echo "wget status: $wgetstatus"
sleep 1
done

# Next
echo "wget successful -- continuing script"


Δεν θα συνεχίσει όμως από εκεί που σταμάτησε. Υπάρχει μια επιλογή στο wget (-c) αλλά αν αλλάξει το αρχείο, θα πάρεις το μισό παλιό αρχείο και το μισό καινούργιο, που τις πλείστες φορές δεν θα είναι το καινούργιο αρχείο.
Η καλύτερη λύση σ'αυτή την περίπτωση είναι να το ξανακατεβάσεις από την αρχή.

Αν θέλεις να συνεχίσει από εκεί που έμεινε, η καλύτερη λύση είναι με το rsync (Φυσικά ο server πρέπει να προσφέρει rsync πρωτόκολλο, το οποίο θα πρέπει να συζητήσεις με τον διαχειριστή του server ή με κάποιον αρμόδιο -- τα πανεπιστήμια συνήθως προσφέρουν rsync). Παράδειγμα rsync εντολής με το ubuntu 12.04 iso:
Κώδικας: Επιλογή όλων
rsync -PL rsync://releases.ubuntu.com/releases/precise/ubuntu-12.04-desktop-amd64.iso ./ubuntu-12.04-desktop-amd64.iso
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

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

Δημοσίευσηαπό evolgen » 26 Μάιος 2012, 18:36

Ευχαριστώ για τις συμβουλές παιδιά!

medigeek έγραψε:
Παραδείγματα ως script:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#!/bin/bash
wget -q "http://google.com/index.test"
wgetstatus="$?"

if [ $wgetstatus -eq 0 ]; then
echo "Success"
else
echo "Something went wrong"
fi


Κάτι παρόμοιο με αυτό έχω κάνει ως τώρα. Το θέμα είναι ότι το wget βγάζει exit status 0 όταν αλλάζει το αρχείο στο server. Δοκίμασα και το δικό σου script με έναν server που μου παρέχει το Πανεπιστήμιο και την ώρα που άλλαζα το αρχείο, το script σταμάτησε και έγραψε success.

Στο δικό μου script, η αποτυχία έρχεται με το gunzip, όταν πάει να αποσυμπιέσει τη βάση, το οποίο του βγάζει "unexpected end of file" ή κάτι παρόμοιο, δε θυμάμαι τώρα. Θα δοκιμάσω να εφαρμόσω την ίδια λογική στη φάση του gunzip, οπότε αν αποτύχει να το αποσυμπιέσει, να το ξανακατεβάσει.


EDIT: Το δοκίμασα και δουλεύει, όταν ο έλεγχος γίνεται στο gunzip. Ευχαριστώ πολύ παιδιά! :bow:
Το να μειώνεις ένα έργο ελεύθερου λογισμικού, επειδή θεωρείς το δικό σου καλύτερο,
είναι απαράδεκτη συμπεριφορά και δε συμβαδίζει με τις αρχές του ελεύθερου λογισμικού.

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

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

Δημοσίευσηαπό medigeek » 26 Μάιος 2012, 23:42

evolgen έγραψε:Το θέμα είναι ότι το wget βγάζει exit status 0 όταν αλλάζει το αρχείο στο server. Δοκίμασα και το δικό σου script με έναν server που μου παρέχει το Πανεπιστήμιο και την ώρα που άλλαζα το αρχείο, το script σταμάτησε και έγραψε success.

Κανονικά θα έπρεπε να είναι status 1:
https://www.gnu.org/software/wget/manua ... tatus.html
έγραψε:0 No problems occurred.


Η αναφορά σφάλματος παίρνει 5-10 λεπτά από τον χρόνο σου :)
https://savannah.gnu.org/bugs/?group=wget
http://wget.addictivecode.org/BugTracker
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

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

Δημοσίευσηαπό evolgen » 27 Μάιος 2012, 00:10

medigeek έγραψε:
evolgen έγραψε:Το θέμα είναι ότι το wget βγάζει exit status 0 όταν αλλάζει το αρχείο στο server. Δοκίμασα και το δικό σου script με έναν server που μου παρέχει το Πανεπιστήμιο και την ώρα που άλλαζα το αρχείο, το script σταμάτησε και έγραψε success.

Κανονικά θα έπρεπε να είναι status 1:
https://www.gnu.org/software/wget/manua ... tatus.html
έγραψε:0 No problems occurred.


Η αναφορά σφάλματος παίρνει 5-10 λεπτά από τον χρόνο σου :)
https://savannah.gnu.org/bugs/?group=wget
http://wget.addictivecode.org/BugTracker

Ορίστε! :)
Το να μειώνεις ένα έργο ελεύθερου λογισμικού, επειδή θεωρείς το δικό σου καλύτερο,
είναι απαράδεκτη συμπεριφορά και δε συμβαδίζει με τις αρχές του ελεύθερου λογισμικού.

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

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

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

cron