Προς το περιεχόμενο

Ultimate shell: bash/fish/zsh/csh/whatever


mad-proffessor

Προτεινόμενες αναρτήσεις

Ερώτηση: όταν κάποιος χρησιμοποιεί shell διαφορετικό από το bash, πρέπει να κάνει προσαρμογές/αλλαγές σε σκριπτάκια και εντολές που βρίσκει κανείς online ή δουλεύουν όλα ακριβώς το ίδιο;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Υπάρχει ένα perl script στα εργαλεία της debian που ελέγχει για χρήση bashisms, λέγεται... checkbashisms :) και θα το βρείτε στο πακέτο devscripts.

Εντελώς εμπειρικά, τα ποιό κοινά "bashisms" είναι η χρήση των double brackets για tests  και η χρήση bash arrays.

 

 

 

(Edit: links για online manpages και αναφορά στο πακέτο)

Επεξ/σία από mobinmob
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σημειωτέον ότι με εγκατεστημένο το bash, που ούτως ή άλλως υπάρχει προεγκατεστημένο στις περισσότερες διανομές, και αφήνοντας την πρώτη γραμμή του script με την διαδρομή του interpreter (bash) ανέπαφη, δεν υπάρχει πρόβλημα στην εκτέλεση του script

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σημειωτέον ότι με εγκατεστημένο το bash, που ούτως ή άλλως υπάρχει προεγκατεστημένο στις περισσότερες διανομές, και αφήνοντας την πρώτη γραμμή του script με την διαδρομή του interpreter (bash) ανέπαφη, δεν υπάρχει πρόβλημα στην εκτέλεση του script

 

Πολύ σωστό. Επίσης τα πιο πολλά scripts έχουν ως interpreter το /bin/sh που είναι symlink συνήθως στο bash οπότε αν κάποιος απεγκαταστήσει τη bash(δε το συνιστώ) το μόνο που χρειάζεται είναι να κάνει symlink το sh στο zsh και να ελέγξει για bashisms όπως σωστα ειπώθηκε.

Κανένας oldschool  unix-ας με ksh,csh ή κάτι άλλο να μας πει εμπειρίες;

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Παλαιότερα είχα γράψει κάποια σύντομα χαρακτηριστικά αλλά δεν βρίσκω το μήνυμα οπότε ας το γράψω ξανά εδώ.

 

* Επεξεργασία μεταβλητών

 

Πολύ συχνά χρειάζεται κάποιος να επεξεργαστεί μεταβλητές (κυρίως την PATH). Το να προσθέσουμε ένα νέο κατάλογο είναι εύκολο και γράφεις απλά PATH="$PATH:τάδε". Τι γίνεται όμως αν θέλεις να αφαιρέσεις ή να αλλάξεις ένα ήδη υπάρχοντα κατάλογο ?

 

Πρέπει να γράψεις "echo $PATH" για να δεις την τρέχουσα τιμή, να γράψεις PATH=", να κάνεις copy-paste με το ποντίκι το 1ο τμήμα, να γράψεις τις αλλαγές και να κάνεις copy-paste το 2ο τμήμα.

 

Στο ZSH απλά γράφεις vared PATH και σου εμφανίζεται η τρέχουσα τιμή, μετακινείσαι σε όποιο σημείο της θέλεις, το αλλάζεις και πατώντας enter θα τεθεί η νέα τιμή χωρίς να πρήζεσαι.

 

* Γραμμή εντολών πολλαπλών γραμμών

 

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

 

for i in 1 2 3; do
echo $i
done
Αν πατήσουμε στο ZSH τα πλήκτρα βέλους πάνω / κάτω, δεν αλλάζει η εντολή από το ιστορικό αλλά μεταφερόμαστε στις γραμμές αυτής της εντολής οπότε μπορούμε πολύ εύκολα να διορθώσουμε κάποια εντολή (πχ την echo).

 

* Διόρθωση γραμματικών λαθών

 

Αυτό δεν είναι κάτι ιδιαίτερο και πολλές φορές είναι σπαστικό κιόλας αλλά υπάρχει υποστήριξη διόρθωσης συχνών λαθών.

 

xs directory

cd directory
Αν κάποιος πχ θέλει να μπει σε ένα κατάλογο και από λάθος γράψει "xs", αυτό θα διορθωθεί αυτόματα σε "cd". Το ZSH δηλαδή όταν δεν βρει στο PATH την εντολή που έχουμε γράψει, ψάχνει να δει με βάση τη θέση των πλήκτρων στο πληκτρολόγιο (εκτός από qwerty υπάρχει πρόνοια και για dvorak λόγω διαφορετικής θέσης πλήκτρων) αν υπάρχει κάποια εντολή που να σχηματίζεται. Αν μετακινηθούμε μία θέση δεξιά, το xs γίνεται cd.

 

* Μοναδικές μεταβλητές

 

Οι μεταβλητές μπορούν να επισημανθούν ως μοναδικές το οποίο λέει στο ZSH να αφαιρεί τις περιττές καταχωρήσεις.

 

echo $PATH | grep τάδε > /dev/null
if [ $? != 0 ]; then
PATH=$PATH:τάδε
fi
Πολλές φορές βλέπουμε στα αρχεία ρύθμισης του bash κώδικες σαν τον παραπάνω. Ο κώδικας ελέγχει αν υπάρχει ο τάδε κατάλογος και αν δεν υπάρχει τον εισάγει. Αυτό δεν χρειάζεται στο ZSH και απλά γράφουμε "PATH=$PATH:τάδε" γιατί αν ο κατάλογος υπάρχει ήδη, το ZSH θα τον αφαιρέσει αυτόματα (αφού φυσικά έχουμε ορίσει το PATH σαν μοναδική μεταβλητή).

 

* Modifiers:

 

Οι modifiers και οι qualifiers είναι μία από τις αγαπημένες μου υποδομές γιατί σου λύνουν τα χέρια στο scripting. Αν δεις ένα script στο BASH, ακόμη και τα πιο απλά πράγματα χρειάζονται να τρέξεις εξωτερικές εντολές.

 

for i in *.wav; do
FNAME=$(basename $i .wav)
lame -o ${FNAME}.mp3 ${i}
done
Πριν κάποια χρόνια που ήταν της μόδας να μετατρέπεις τις συλλογές σου σε MP3, έβλεπες συχνά κώδικες σαν τον παραπάνω. Αυτό που κάνει ο κώδικας είναι να τρέξει σε όλα τα αρχεία με κατάληξη wav και να τα μετατρέψει σε mp3. Για να το κάνει αυτό τρέχει την εξωτερική εντολή basename και της λέει να κόψει την επέκταση .wav ώστε να πάρουμε μόνο το κύριο όνομα.

 

for i in *.wav(:r); do
lame -o ${i}.mp3 ${i}.wav
done
Το παραπάνω είναι ο ίδιος κώδικας αλλά για ZSH. Ο r modifier επιστρέφει μόνο το κύριο όνομα οπότε δεν χρειαζόμαστε εξωτερικές εντολές. Φυσικά αυτό είναι ένα απλό παράδειγμα για να γίνει κατανοητό αυτό που περιγράφω. Υπάρχουν πολλοί modifiers που κάνουν ένα σωρό πράγματα.

 

* Globbing Qualifiers:

 

Οι qualifiers αλλάζουν την συμπεριφορά του globbing (όταν δηλαδή χρησιμοποιούμε *, ?, κτλ για να ψάξουμε πολλαπλά αρχεία)

 

alias lsd='ls -d *(/)'
alias lsdf='ls -a .*(.)'
Δύο από τις συντομεύσεις που χρησιμοποιώ και βρίσκω πολύ βολικές είναι οι παραπάνω. Το * είναι το γνωστό glob που εμφανίζει τα πάντα αλλά το περνάμε από τον τελεστή / ο οποίος κρατάει μόνο ό,τι είναι κατάλογος. Έτσι η εντολή lsd εμφανίζει μόνο τους καταλόγους που υπάρχουν στον τρέχοντα κατάλογο. Ο τελεστής . εμφανίζει αντίστοιχα μόνο τα αρχεία οπότε η εντολή lsdf μας εμφανίζει μόνο τα αρχεία που αρχίζουν από τελεία.

 

for scr in /etc/profile.d/*.sh; do
if [ -x $scr ]; then
. $scr
fi
done
Ο παραπάνω είναι ένας κλασικός κώδικας σε BASH για να τρέχει τα επιμέρους αρχεία ρυθμίσεων που υπάρχουν στον κατάλογο profile.d. Βλέπει με την if ποια είναι εκτελέσιμα και εκτελεί μόνο εκείνα.

 

for scr in /etc/profile.d/*.sh(x); do
. $scr
done
Ο ίδιος κώδικας σε ZSH χρησιμοποιεί τον τελεστή x ο οποίος επιστρέφει κατευθείαν μόνο τα εκτελέσιμα αρχεία οπότε γλυτώνουμε το if.

 

* Global συντομεύσεις

 

Εκτός από τις απλές συντομεύσεις που υποστηρίζει και το BASH και είδαμε και παραπάνω στις εντολές lsd, lsdf, το ZSH υποστηρίζει και ολικές συντομεύσεις. Η διαφορά τους είναι ότι αντιστοιχίζονται όχι μόνο στο τμήμα της εντολής αλλά οπουδήποτε και αν βρίσκονται. Έτσι χρησιμοποιούνται συχνά για την υλοποίηση pipes, κτλ.

 

alias -g WC="|wc -l"
alias -g G="|grep"

cat file WC
cat file G pattern
Στο παραπάνω παράδειγμα, το WC θα αντιστοιχηθεί και έτσι θα είναι σαν να γράψαμε "cat file | wc -l".

 

* Συντομεύσεις επεκτάσεων:

 

Ένα ακόμη είδος συντομεύσεων που υποστηρίζει το ZSH είναι οι "suffix" συντομεύσεις οι οποίες έχουν την ίδια λειτουργία με την "file association" που υπάρχει στα GUI.

 

alias -s pdf=okular
Όπως σε ένα GUI όταν κάνουμε διπλό κλικ πάνω σε ένα .pdf αρχείο, το ανοίγει με μια εφαρμογή που έχουμε επιλέξει, οι suffix συντομεύσεις λένε στο ZSH ότι όταν γράψουμε το όνομα ενός αρχείου με την επέκταση pdf χωρίς να έχουμε δηλώσει εντολή, τότε να θεωρεί ότι θέλουμε να το ανοίξουμε με το okular σαν να είχαμε γράψει "okular αρχείο.pdf"

 

* Συντομεύσεις καταλόγων

 

Μπορούμε να ορίσουμε συντομεύσεις για καταλόγους που χρησιμοποιούμε συχνά.

 

hash -d L=/usr/src/linux
cd ~L
Με την παραπάνω hash ορίζουμε την συντόμευση L για τον κατάλογο /usr/src/linux οπότε όταν γράφουμε "cd ~L" είναι σαν να γράψαμε όλο τον κατάλογο (υπάρχει επιλογή που μπορούμε να παραλείψουμε και το ~ και να γράφουμε σκέτο L).

 

Εκτός από τα παραπάνω, το ZSH υλοποιεί ένα κάρο πράγματα που δεν έχουν τα άλλα κελύφη και που μας κάνουν εύκολη τη ζωή. Ακόμη και αυτά που υλοποιεί το BASH είναι απείρως καλύτερα στο ZSH. Κάποια που μου έρχονται στο μυαλό είναι πληρέστερη υλοποίηση arrays, πολύ καλύτερο ψάξιμο ιστορικού με το Ctrl-R (γενικά στο ιστορικό μπορείς να κάνεις παπάδες), πολύ καλύτερη επέκταση με το Tab, κτλ.

 

Πέρα από την αδράνεια δεν υπάρχει κανένα λόγος να μην τρέχει κάποιος ZSH.

 

Posix compatible είναι.

Σημείωση δεν είμαι bash hater απλά πίστευα κ πιστεύω ότι έχει security vulnerabilities. Τώρα για το διάβασμα μη δίνεις όρκο εκτός κ αν γράφεις άπειρα scripts ολημερίς.

Προβλήματα ασφαλείας σίγουρα θα έχει και το ZSH. Χρησιμοποιώ όλη μέρα ZSH και VIM και είναι τα καταπληκτικότερα εργαλεία αλλά ο κώδικάς τους (λόγω των πολλών πραγμάτων που υλοποιούν και τον πολλών χρόνων ανάπτυξής τους) είναι λίγο σπαγκέτι. Απλά ίσως να μην έχουν ασχοληθεί σε τόσο μεγάλο βαθμό hackers μαζί του λόγω μικρότερου αριθμού χρηστών.

 

Καθόλου διάβασμα.

5 λεπτά να το σετάρεις μόνο (oh-my-zsh).

 

Και μόνο για το πολύ καλύτερο auto-completion αξίζει...

Γενικά όντως θέλει διάβασμα. Μπορώ να πω ότι χωρίς κάποιο έτοιμο αρχείο ρύθμισης είναι πολύ πιο lame από το BASH. Θυμάμαι όταν το έτρεξα πρώτη φορά απογοητεύτηκα τρελά γιατί δεν έπαιζαν ούτε τα μισά από ό,τι στο BASH. Αφού έκατσα και έφαγα ουκ ολίγο χρόνο να διαβάζω την manpage και να γράψω ένα zshrc, τότε είδα τι μπορεί να κάνει.

 

Σήμερα φυσικά που μπορείς να τρέξεις με τη μία ένα από τα έτοιμα ολοκληρωμένα προφίλ όπως το oh-my-zsh, είναι τελείως διαφορετικά τα πράγματα.

  • Like 5
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@imitheos
Ευχαριστούμε για το αναλυτικότατο post.

Με το καθόλου διάβασμα αναφερόμουν σε αυτούς που δεν θέλουν να ασχοληθούν με shell scripting και σκοπεύουν να χρησιμοποιήσουν κάποιο έτοιμο προφιλ, καθώς όπως είπες και συ ο zsh υλοποιεί τις ίδιες λειτουργίες πολύ καλύτερα. Προσωπικά θυμάμαι ότι απλά είχα κατεβάσει το oh-my-zsh, έφτιαξα ένα theme (αν και υπάρχουν άπειρα έτοιμα), μετέφερα και τα aliases που χρησιμοποιούσα στο bash και ήμουν έτοιμος.

Για scripting φαντάζομαι και ο bash θέλει αρκετό διάβασμα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...