Είναι μια μαγκιά του bash που λέγεται process substitution. Ό,τι βλέπεις μέσα στην παρένθεση είναι μια εντολή (προσοχή να μην έχει κενό ανάμεσα στο > και την παρένθεση).
Η κανονική σύνταξη που ξέρουμε 1 | 2.Κώδικας:% ls -al /usr/bin|head -5 σύνολο 297468 drwxr-xr-x 1 root root 31522 Αυγ 15 09:07 ./ drwxr-xr-x 1 root root 128 Αυγ 4 11:54 ../ -rwxr-xr-x 1 root root 57432 Αυγ 15 2020 [* lrwxrwxrwx 1 root root 31 Αυγ 1 09:14 2to3 -> ../lib/python-exec/python-exec2*
Η σύνταξη με την process substitution. Πρόσεξε ότι υπάρχουν δύο >. Το μόνο του είναι που κάνει redirect την έξοδο της ls και το δεύτερο πετάει αυτό που έγινε redirect σαν είσοδο στην head.Κώδικας:% ls -al /usr/bin > >(head -5) σύνολο 297468 drwxr-xr-x 1 root root 31522 Αυγ 15 09:07 ./ drwxr-xr-x 1 root root 128 Αυγ 4 11:54 ../ -rwxr-xr-x 1 root root 57432 Αυγ 15 2020 [* lrwxrwxrwx 1 root root 31 Αυγ 1 09:14 2to3 -> ../lib/python-exec/python-exec2* % echo <(head -5) /proc/self/fd/11
Όπως βλέπεις, το bash ανοίγει ένα handle και το κάνει bind στην είσοδο ή έξοδο μιας εντολής, χωρίς εσύ να χρειάζεται να ξέρεις ποιο αρχείο είναι αυτό (εδώ είναι το 11 handle) και χωρίς να υπάρχει κανονικό αρχείο. Σκέψου ότι κάνεις το παρακάτω:
αλλά χωρίς να χρειάζεται να δημιουργηθεί το fifo.Κώδικας:% mkfifo /tmp/aaa % ls -al /usr/bin > /tmp/aaa & % head -5 < /tmp/aaa σύνολο 297468 drwxr-xr-x 1 root root 31522 Αυγ 15 09:07 ./ drwxr-xr-x 1 root root 128 Αυγ 4 11:54 ../ -rwxr-xr-x 1 root root 57432 Αυγ 15 2020 [* lrwxrwxrwx 1 root root 31 Αυγ 1 09:14 2to3 -> ../lib/python-exec/python-exec2* % rm /tmp/aaa
Επειδή εσύ ήθελες να πετάξεις την έξοδο όχι σε ένα αλλά σε δύο αρχεία (νομίζω πως σε bash μπορείς να έχεις redirection σε πολλά αρχεία αλλά δεν θυμάμαι), ο billy χρησιμοποιεί την tee που έχει αυτή τη δυνατότητα. Έχω την εντύπωση όμως ότι δεν θα παίξει έτσι όπως το έχει, επειδή το tee, πέρα από τα αρχεία που του δηλώσεις, πετάει την έξοδο και στο stdout. Οπότε λοιπόν, μια πιο σωστή εκδοχή θα είναι η εξής:
Κώδικας:ls -lat | tee >(head) >(tail) > /dev/null
Εμφάνιση 1.576-1.590 από 2226
Θέμα: Ερώτηση για bash
-
15-08-21, 11:31 Απάντηση: Ερώτηση για bash #1576"I like offending people, because I think people who get offended should be offended" - Linus Torvalds
"Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
Γα.... την πολιτική ορθότητα.
-
15-08-21, 17:12 Απάντηση: Ερώτηση για bash #1577
Ευχαριστώ, δεν τα ήξερα αυτά. Η λύση αυτή όμως είναι πολύ πολύπλοκη, δεν έχει κανένα μαγικό τρόπο η ls; Αν είναι να κάνω κάτι τόσο πολύπλοκο, θα παραμείνω στον τρόπο που το κάνω τώρα, ήλπιζα σε κάτι απλούστερο.
-
15-08-21, 17:16 Απάντηση: Ερώτηση για bash #1578"I like offending people, because I think people who get offended should be offended" - Linus Torvalds
"Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
Γα.... την πολιτική ορθότητα.
-
16-08-21, 13:50 Απάντηση: Ερώτηση για bash #1579
-
16-08-21, 14:22 Απάντηση: Ερώτηση για bash #1580
Δεν είναι atomic Μπορεί τα περιεχόμενα να αλλάξουν ανάμεσα στις δύο εκτελέσεις της ls
Κανονικά δεν θα έπρεπε καν να χρησιμοποιήσεις την ls γιατί δενπρέπεισυστήνεται να γίνεται parse η έξοδος της ls. Δυστυχώς όμως δεν βλέπω κάποιο άλλο τρόπο να το κάνεις. Κανονικά αυτό είναι δουλειά του globbing του shell.
[shameless ZSH promotion]Σε ZSH γίνεται πολύ εύκολα με glob qualifiers.
Κώδικας:% cd /usr/sbin % ls -lat | head && ls -lat | tail σύνολο 25572 drwxr-xr-x 1 root root 3176 Αυγ 15 09:06 ./ lrwxrwxrwx 1 root root 4 Αυγ 15 09:05 vigr -> vipw* -rwxr-xr-x 1 root root 67672 Αυγ 15 09:05 vipw* -rwxr-xr-x 1 root root 135960 Αυγ 15 09:05 usermod* -rwxr-xr-x 1 root root 93656 Αυγ 15 09:05 userdel* -rwxr-xr-x 1 root root 149032 Αυγ 15 09:05 useradd* -rwxr-xr-x 1 root root 50400 Αυγ 15 09:05 pwunconv* -rwxr-xr-x 1 root root 54776 Αυγ 15 09:05 pwconv* -rwxr-xr-x 1 root root 59704 Αυγ 15 09:05 pwck* -rwx--x--x 1 root root 44544 Νοε 7 2020 mtr-packet* -rwxr-xr-x 1 root root 75288 Νοε 2 2020 iftop* -rwxr-xr-x 1 root root 17392 Αυγ 17 2020 testsaslauthd* -rwxr-xr-x 1 root root 56184 Αυγ 17 2020 saslauthd* -rwxr-xr-x 1 root root 17888 Αυγ 17 2020 pwcheck* -rwxr-xr-x 1 root root 22616 Αυγ 17 2020 pluginviewer* -rwxr-xr-x 1 root root 71840 Ιουν 29 2020 iucode_tool* -rwxr-xr-x 1 root root 106848 Μαΐ 31 2020 lspci* -rwxr-xr-x 1 root root 39536 Μαΐ 31 2020 setpci* -rwxr-xr-x 1 root root 12519 Νοε 8 2019 build-docbook-catalog*
Κώδικας:% echo *(om[1,10]) *(Om[1,10]) vigr vipw usermod userdel useradd pwunconv pwconv pwck newusers logoutd build-docbook-catalog lspci setpci iucode_tool pluginviewer pwcheck saslauthd testsaslauthd iftop mtr-packet
Με αυτό τον τρόπο, αντί για το echo, μπορούσες να έχεις κάποιο for ή οποιαδήποτε άλλη εντολή στην οποία τα αρχεία να πάνε κατευθείαν σαν ορίσματα, χωρίς να χρειάζεται parsing.
Υπάρχουν πάρα μα πάρα πολλά παραπάνω πράγματα που κάνει το ZSH έναντι του bash αλλά ειδικά τα modifiers και τα qualifiers σου λύνουν τα χέρια.
[/shameless ZSH promotion]"I like offending people, because I think people who get offended should be offended" - Linus Torvalds
"Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
Γα.... την πολιτική ορθότητα.
-
16-08-21, 14:22 Απάντηση: Ερώτηση για bash #1581
-
09-09-21, 17:23 Απάντηση: Ερώτηση για bash #1582
Καλησπέρα παιδιά.
Έχω ένα project μικρό και έχει λοιπόν ένα bash script (clang-format.sh) που εκτελείται ως target από το cmake.
Κώδικας:#!/bin/bash #Make sure it is installed first. if ! command -v clang-format &> /dev/null then echo "clang-format could not be found. Install it or make it visible under the PATH." exit fi find . -regex '.*\.\(cpp\|hpp\|cu\|c\|h\)' -exec clang-format -style=file -i {} \;
Κώδικας:qasm2hex | |->build |->.... |->submodules | | | |->keystone | |->src | | | |-> mainwindow.cpp | |-> .... // source code | |->tools | | | |->clang-format.sh // <- script | |->CMakeLists.txt |->.clang-format
ΕυχαριστώΜε ΜΑΤ και βία δεν βγαίνει πανδημία, Μιχαλάκη και Κούλη.
-
09-09-21, 17:58 Απάντηση: Ερώτηση για bash #1583
Δηλαδή θέλεις να παίζει μόνο στον src και κάτω; Αν αλλάξεις το "find ." σε "find src/" δεν θα κάνει αυτό που θέλεις;
"I like offending people, because I think people who get offended should be offended" - Linus Torvalds
"Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
Γα.... την πολιτική ορθότητα.
-
09-09-21, 21:28 Απάντηση: Ερώτηση για bash #1584
Αυτό με προβληματίζει. Το find . λογικά σημαίνει find μέσα στο current directory και κάτω, δηλαδή ότι regex υπάρχει στο tools. Αφού δεν υπάρχει.
Άρα για να δουλεύει το find . κάτι άλλο κάνει. Θα περίμενα να ήταν ας πούμε find ../ κτλ, για να πάει ένα κατάλογο πιο πάνω και να βρει recursively όλα τα αρχεία που θέλει το regex.Με ΜΑΤ και βία δεν βγαίνει πανδημία, Μιχαλάκη και Κούλη.
-
16-09-21, 15:16 Απάντηση: Ερώτηση για bash #1585
Πως βαζω μια variable (EXPORT=blablabla) σε ενα εκτελεσιμο που θα τρεξω απο το φακελο που το περιεχει? Πιο συγκεκριμενα, θελω να τρεξω το εκτελεσιμο του ff 93 beta με την παραμετρο
Κώδικας:$ MOZ_WEBRENDER=0 firefox
ديميتريس
-
16-09-21, 17:15 Απάντηση: Ερώτηση για bash #1586
Δεν είμαι σίγουρος ότι κατάλαβα τι θέλεις να κάνεις. Δηλαδή το τρέχεις μέσα από γραφικό file manager (πχ dolphin, caja, κτλ);
Αν ναι, τότε συνήθως δημιουργείς είτε ένα shell script ή ένα "application" αρχείο (που να τελειώνει σε .desktop δηλαδή) το οποίο θα τρέχει "env MOZ_WEBRENDER=0 /usr/bin/firefox" αντί για σκέτο "/usr/bin/firefox".
Αντί να κάνεις κάτι από αυτά που είναι πολύπλοκα, δεν σε βολεύει να θέτεις την μεταβλητή σε κάποιο από τα αρχεία εκκίνησης του shell σου (πχ το .bashrc) και μετά να τρέχεις απλά τον firefox από όπου θέλεις; Νομίζω πως στην πλειοψηφία των περιπτώσεων λειτουργεί αυτό απλά θα ισχύει για όλους τους firefox και όχι μόνο για τον beta."I like offending people, because I think people who get offended should be offended" - Linus Torvalds
"Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
Γα.... την πολιτική ορθότητα.
-
16-09-21, 19:15 Απάντηση: Ερώτηση για bash #1587
Αν το βαλω στο bashrc, δεν θα πρεπει πρωτα να ανοιγω ενα τερματικο και μετα να τρεχω τον ff (απο συντομευση ή μεσα απο το ιδιο το τερματικο)?
Θελω να τρεξω το ετοιμο binary του ff μεσα απο ενα φακελο που θα το εχω αποσυμπιεσμενο.ديميتريس
-
16-09-21, 20:10 Απάντηση: Ερώτηση για bash #1588
Ανάλογα με τη διανομή και το πώς τρέχει ο Xorg, κατά την εκκίνησή μπορεί να φορτώνονται ή όχι τα αρχεία εκκίνησης του shell. Όταν τρέχεις τον xorg από τερματικό με startx, οι περισσότερες εφαρμογές που τρέχουν μετά κληρονομούν όλο το περιβάλλον που είχες στο shell. Όταν τον τρέχεις μέσω Xsession / gdm / sddm / κτλ, νομίζω ότι και πάλι φορτώνονται τα αρχεία εκκίνησης του shell αλλά μόνο τα global από το /etc και όχι αυτά του χρήστη. Δεν το θυμάμαι στα σίγουρα.
Νομίζω πως για να παίξει μέσω *dm, πρέπει να το ορίσεις στα global αρχεία ή στο /etc/pam/environment. Δεν πολύ-θυμάμαι πώς δουλεύει οπότε περίμενε να σου απαντήσει κάποιος άλλος μήπως μπορείς να το κάνεις πιο εύκολα και να μην μπλέξεις με αυτά που λέω εγώ."I like offending people, because I think people who get offended should be offended" - Linus Torvalds
"Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
Γα.... την πολιτική ορθότητα.
-
17-09-21, 09:40 Απάντηση: Ερώτηση για bash #1589
-
19-09-21, 02:26 Απάντηση: Ερώτηση για bash #1590
Το export δεν είναι απαραίτητο σε μια τέτοια περίπτωση.
Απλά θεσε τις μεταβλητές που θες, στην αρχή στην ίδια εντολή (γραμμή).NetBSD Rocks!
http://www.netbsd.org
Παρόμοια Θέματα
-
Βοήθεια για ένα απλό bash script
Από AddictedToChaos στο φόρουμ Unix - LinuxΜηνύματα: 34Τελευταίο Μήνυμα: 22-07-11, 01:57 -
bash - matlab
Από simeon.mattes στο φόρουμ Unix - LinuxΜηνύματα: 25Τελευταίο Μήνυμα: 25-06-08, 23:00 -
Bash Script help (Αρχάριος)
Από weakwire στο φόρουμ Unix - LinuxΜηνύματα: 12Τελευταίο Μήνυμα: 08-05-07, 00:41 -
bash rename (mv)
Από hayzel στο φόρουμ Unix - LinuxΜηνύματα: 6Τελευταίο Μήνυμα: 07-01-07, 16:33
Bookmarks