<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>iridakos - opensource articles</title>
    <description>Lazarus Lazaridis' personal blog with posts mostly related to programming and opensource. And cats.</description>
    <link>https://iridakos.com/</link>
    <image>
      <url>https://iridakos.com/assets/images/site.png</url>
      <link>https://iridakos.com/</link>
      <title>iridakos</title>
    </image>
    <atom:link href="https://iridakos.com/el/feeds/opensource.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Wed, 13 May 2020 08:59:17 +0300</pubDate>
    <lastBuildDate>Wed, 13 May 2020 08:59:17 +0300</lastBuildDate>
    <generator>Jekyll v3.8.6</generator>
    <foo>ha</foo>
    

    
      <item>
        <title>stup - ένα εργαλείο κονσόλας για καθημερινές σημειώσεις</title>
        <description>&lt;p&gt;Τα τελευταία χρόνια συμμετέχω σε καθημερινά &lt;a href=&quot;https://en.wikipedia.org/wiki/Stand-up_meeting&quot;&gt;Stand-up meetings&lt;/a&gt; και μου δημιουργήθηκε η ανάγκη να βρω έναν βολικό και αποτελεσματικό τρόπο να κρατάω σημειώσεις σχετικά με το τι έκανα κάθε μέρα.&lt;/p&gt;

&lt;p&gt;Χρειαζόμουν:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;να κρατώ &lt;strong&gt;κατηγοριοποιημένες σημειώσες&lt;/strong&gt; για τα issues πάνω στα οποία εργαζόμουν, τις συναντήσεις στις οποίες συμμετείχα, πράγματα που εμπόδιζαν τη δουλειά μου κ.λπ.&lt;/li&gt;
  &lt;li&gt;να μπορώ εύκολα να &lt;strong&gt;ανακτήσω αυτές τις σημειώσεις βάσει της ημερομηνίας&lt;/strong&gt; στην οποία καταχωρήθηκαν&lt;/li&gt;
  &lt;li&gt;να έχω μια &lt;strong&gt;γενική εικόνα&lt;/strong&gt; για το τι έκανα (για παράδειγμα την τελευταία εβδομάδα)&lt;/li&gt;
  &lt;li&gt;όλα τα παραπάνω:
    &lt;ul&gt;
      &lt;li&gt;μέσα από την &lt;strong&gt;κονσόλα&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;χωρίς να χρειάζεται να διαμορφώσω και να συντηρώ ένα αρχείο με όλες τις σημειώσεις χειροκίνητα&lt;/li&gt;
      &lt;li&gt;χωρίς να χρειάζεται να διαμορφώνω και να συντηρώ ένα αρχείο για κάθε μέρα με όλες τις σημειώσεις χειροκίνητα&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;stup&quot;&gt;stup&lt;/h2&gt;

&lt;p&gt;Υλοποίησα το &lt;a href=&quot;https://github.com/iridakos/stup&quot;&gt;stup&lt;/a&gt; (το όνομα προέρχεται από τον όρο &lt;strong&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;st&lt;/code&gt;&lt;/strong&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;and-&lt;/code&gt;&lt;strong&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;up&lt;/code&gt;&lt;/strong&gt;), ένα πρόγραμμα ανοιχτού κώδικα, για να καλύψω τις ανάγκες αυτές.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/iridakos/stup/blob/master/assets/stup-0-1-9.gif?raw=true&quot; alt=&quot;stup demo gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ο πηγαίος κώδικας είναι διαθέσιμος στο &lt;a href=&quot;https://github.com/iridakos/stup&quot; target=&quot;_blank&quot;&gt;GitHub εδώ&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;παραδείγματα-χρήσης&quot;&gt;Παραδείγματα χρήσης&lt;/h3&gt;

&lt;p&gt;Παραθέτω κάποια παραδείγματα που παρουσιάζουν τις βασικότερες χρήσεις του &lt;code class=&quot;highlighter-rouge&quot;&gt;stup&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;προσθήκη-σημειώσεων&quot;&gt;Προσθήκη σημειώσεων&lt;/h4&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Προσθήκη σημείωσης στην προεπιλεγμένη κατηγορία για την τρέχουσα ημερομηνία&lt;/span&gt;
stup add &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Worked on issue #ABC123&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Προσθήκη σημείωσης στην προεπιλεγμένη κατηγορία υπονοώντας την τρέχουσα ημερομηνία&lt;/span&gt;
stup add today &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Worked on issue #ABC123&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Προσθήκη σημείωσης στην κατηγορία &quot;meetings&quot;&lt;/span&gt;
stup add today &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;meetings&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;2 hours with @phoebe for the project kick off&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Προσθήκη σημείωσης στην κατηγορία &quot;blocking&quot; στις 10 Απριλίου, 2020&lt;/span&gt;
stup add @ 2020-04-10 &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;blocking&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;connectivity issues&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;εμφάνιση-σημειώσεων-συγκεκριμένης-ημέρας&quot;&gt;Εμφάνιση σημειώσεων συγκεκριμένης ημέρας&lt;/h4&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Εμφάνιση χθεσινών σημειώσεων (υπονοώντας την ημέρα)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;stup

&lt;span class=&quot;c&quot;&gt;# Εμφάνιση χθεσινών σημειώσεων (με σαφή προσδιορισμό της ημέρας)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;stup yesterday

&lt;span class=&quot;c&quot;&gt;# Εμφάνιση των σημερινών σημειώσεων&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;stup today

&lt;span class=&quot;c&quot;&gt;# Εμφάνιση σημειώσεων σε συγκεκριμένη ημερομηνία&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;stup show @ 2020-04-18

&lt;span class=&quot;c&quot;&gt;# Εμφανίση σημειώσεων για συγκεκριμένη κατηγορία σε συγκεκριμένη ημέρα&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;stup show @ 2020-04-18 &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;meetings&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;λίστα-όλων-των-σημειώσεων-για-ένα-χρονικό-διάστημα&quot;&gt;Λίστα όλων των σημειώσεων για ένα χρονικό διάστημα&lt;/h4&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Λίστα των σημειώσεων της τρέχουσας εβδομάδας&lt;/span&gt;
stup log week

&lt;span class=&quot;c&quot;&gt;# Λίστα των σημειώσεων της τρέχουσας εβδομάδας (υπονοώντας την ενέργεια log)&lt;/span&gt;
stup week

&lt;span class=&quot;c&quot;&gt;# Λίστα των σημειώσεων της προηγούμενης εβοδμάδας&lt;/span&gt;
stup log previous-week

&lt;span class=&quot;c&quot;&gt;# Λίστα των σημειώσεων της προηγούμενης εβοδμάδας (υπονοώντας την ενέργεια log)&lt;/span&gt;
stup previous-week

&lt;span class=&quot;c&quot;&gt;# Λίστα σημειώσεων μεταξύ δύο ημερομηνιών&lt;/span&gt;
stup log &lt;span class=&quot;nt&quot;&gt;--from&lt;/span&gt; 2020-01-20 &lt;span class=&quot;nt&quot;&gt;--to&lt;/span&gt; 2020-03-02

&lt;span class=&quot;c&quot;&gt;# Λίστα σημειώσεων μεταξύ δύο ημερομηνιών για συγκεκριμένη κατηγορία&lt;/span&gt;
stup log &lt;span class=&quot;nt&quot;&gt;--from&lt;/span&gt; 2020-01-20 &lt;span class=&quot;nt&quot;&gt;--to&lt;/span&gt; 2020-03-02 &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;meetings&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;πως-λειτουργεί-σε-τεχνικό-επίπεδο&quot;&gt;Πως λειτουργεί σε τεχνικό επίπεδο&lt;/h3&gt;

&lt;p&gt;Οι σημειώσεις είναι οργανωμένες σε κατηγορίες.&lt;/p&gt;

&lt;p&gt;Όταν προστίθεται μια σημείωση, το &lt;code class=&quot;highlighter-rouge&quot;&gt;stup&lt;/code&gt; αποθηκεύει ένα αρχείο markdown και το τοποθετεί μέσα στο φάκελο της κατηγορίας της σημείωσης δημιουργώντας υποφακέλους που αντιστοιχούν στην ημερομηνία της.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CATEGORIES_ROOT_DIRECTORY/CATEGORY/YEAR/MONTH/YYYY-MM-DD.md

&lt;span class=&quot;c&quot;&gt;# Για παράδειγμα, οι σημειώσεις της κατηγορίας &quot;programming&quot;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# για τις 18 Απριλίου 2020 αποθηκεύονται στον φάκελο:&lt;/span&gt;
CATEGORIES_ROOT_DIRECTORY/programming/2020/04/2020-04-18.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Αυτό επιτρέπει τους χρήστες να ανακτήσουν όποιες σημειώσεις προστέθηκαν σε μια συγκεκριμένη ημερομηνία για μια συγκεκριμένη ή για όλες τις κατηγορίες σημειώσεων.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Ανάκτηση σημειώσεων για όλες τις κατηγορίες&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;stup show @ 2020-04-18

&lt;span class=&quot;c&quot;&gt;# Ανάκτηση σημειώσεων για την κατηγορία &quot;programming&quot;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# της προηγούμενης εβδομάδας&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;stup log previous-week &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; programming

&lt;span class=&quot;c&quot;&gt;# Ανάκτηση όλων των σημειώσεων για συγκεκριμένο χρονικό διάστημα&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;stup log &lt;span class=&quot;nt&quot;&gt;--from&lt;/span&gt; 2020-04-01 &lt;span class=&quot;nt&quot;&gt;--to&lt;/span&gt; 2020-04-15
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;περισσότερες-πληροφορίες&quot;&gt;Περισσότερες πληροφορίες&lt;/h3&gt;

&lt;p&gt;Μπορείτε να:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;να επισκεφτείτε το αποθετήριο του προγράμματος στο Github &lt;a href=&quot;https://github.com/iridakos/stup&quot;&gt;εδώ&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;να δείτε όλη την τεκμηρίωση και τις χρήσεις του &lt;code class=&quot;highlighter-rouge&quot;&gt;stup&lt;/code&gt; (με παραδείγματα) &lt;a href=&quot;https://github.com/iridakos/stup/blob/master/README.md&quot;&gt;εδώ&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;να δείτε issues/features προς υλοποίηση &lt;a href=&quot;https://github.com/iridakos/stup/issues&quot;&gt;εδώ&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ευχαριστώ για την ανάγνωση!&lt;/p&gt;
</description>
        <pubDate>Fri, 01 May 2020 12:00:00 +0300</pubDate>
        <link>https://iridakos.com/el/programming/2020/05/01/stup-cli-notes</link>
        <guid isPermaLink="true">https://iridakos.com/el/programming/2020/05/01/stup-cli-notes</guid>
        
        <category>linux</category>
        
        <category>opensource</category>
        
        <category>bash</category>
        
        <category>scripts</category>
        
        <category>productivity</category>
        
        <category>tools</category>
        
        
        <category>programming</category>
        
      </item>
    
      <item>
        <title>Εύρεση παλίνδρομων ημερομηνιών στην Linux κονσόλα - επεξήγηση</title>
        <description>&lt;p&gt;Πρόσφατα είδα μια &lt;a href=&quot;https://twitter.com/climagic/status/1225056662949650432&quot;&gt;πολύ ωραία εντολή&lt;/a&gt; που βρίσκει τις παλίνδρομες ημερομηνίες μεταξύ του τώρα και &lt;code class=&quot;highlighter-rouge&quot;&gt;x&lt;/code&gt; ημερών στο παρελθόν.&lt;/p&gt;

&lt;p&gt;Η εντολή κοινοποιήθηκε στο Twitter από το λογαριασμό &lt;a href=&quot;https://twitter.com/climagic&quot;&gt;@climagic&lt;/a&gt; (ένας πολύ ωραίος λογαριασμός σχετικά με tweets που σχετίζονται με την γραμμή εντολών).&lt;/p&gt;

&lt;p&gt;Σε αυτό το άρθρο θα σπάσω την εντολή σε τμήματα και θα εξηγήσω πως λειτουργεί το καθένα.&lt;/p&gt;

&lt;h2 id=&quot;τι-είναι-το-παλίνδρομο---καρκινική-γραφή&quot;&gt;Τι είναι το παλίνδρομο - Καρκινική γραφή&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Καρκινικές επιγραφές ή καρκίνοι ονομάζονται συμμετρικές φράσεις οι οποίες μπορούν να διαβαστούν είτε από την αρχή είτε από το τέλος.
&lt;cite&gt;– &lt;a href=&quot;https://el.wikipedia.org/wiki/%CE%9A%CE%B1%CF%81%CE%BA%CE%B9%CE%BD%CE%B9%CE%BA%CE%AE_%CE%B3%CF%81%CE%B1%CF%86%CE%AE&quot;&gt;Καρκινική γραφή - Wikipedia&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Πριν λίγες μέρες, η ημερομηνία ήταν παλίνδρομη: &lt;strong&gt;02/02/2020&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/posts/palindrome-shell/02022020.png&quot; alt=&quot;Image showing the palindrome 02022020&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;η-εντολή&quot;&gt;Η εντολή&lt;/h2&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;now - %d days&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;1..332044&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; |date &lt;span class=&quot;nt&quot;&gt;-f-&lt;/span&gt; +%Y%_m%_d&lt;span class=&quot;s1&quot;&gt;$'&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'&lt;/span&gt;%Y%m%d |tr &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;' '&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; alldates.txt&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; rev alldates.txt &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;revdates.txt&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;paste &lt;/span&gt;alldates.txt revdates.txt |awk &lt;span class=&quot;s1&quot;&gt;'$1==$2{print $1}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;και παρακάτω μια περισσότερο αναγνώσιμη εκδοχή της, χρησιμοποιώντας νέα γραμμή μετά από κάθε σωλήνωση.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;now - %d days&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;1..332044&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; |
&lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f-&lt;/span&gt; +%Y%_m%_d&lt;span class=&quot;s1&quot;&gt;$'&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'&lt;/span&gt;%Y%m%d |
&lt;span class=&quot;nb&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;' '&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; alldates.txt&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; rev alldates.txt &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;revdates.txt&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;paste &lt;/span&gt;alldates.txt revdates.txt |
&lt;span class=&quot;nb&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'$1==$2{print $1}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Θα εξηγήσω κάθε τμήμα της εντολής χωριστά.&lt;/p&gt;

&lt;p&gt;Σημειώστε ότι το αποτέλεσμα (output - έξοδος) του κάθε τμήματος αποτελεί είσοδο (input) για το επόμενο τμήμα (αυτό που ακολουθεί τη σωλήνωση &lt;code class=&quot;highlighter-rouge&quot;&gt;|&lt;/code&gt;).&lt;/p&gt;

&lt;h2 id=&quot;printf-now---d-daysn-1332044&quot;&gt;printf &quot;now - %d days\n&quot; {1..332044}&lt;/h2&gt;

&lt;p&gt;Το πρώτο τμήμα είναι αρκετά απλό αλλά έχει και ένα ενδιαφέρον κομμάτι, το &lt;strong&gt;μηχανισμό επέκτασης αγκυλών&lt;/strong&gt; τον οποίο δε γνώριζα.&lt;/p&gt;

&lt;p&gt;Ανοίξτε ένα τερματικό και πληκτρολογήστε τις ακόλουθες εντολές:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Από το 1 έως το 10&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;1..10&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
1 2 3 4 5 6 7 8 9 10

&lt;span class=&quot;c&quot;&gt;# Από το a έως το z&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;a..z&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
a b c d e f g h i j k l m n o p q r s t u v w x y z

&lt;span class=&quot;c&quot;&gt;# Από το 10 έως το 20&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;Before-&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;10..20&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-After&lt;/span&gt;
Before-10-After Before-11-After Before-12-After Before-13-After Before-14-After Before-15-After Before-16-After Before-17-After Before-18-After Before-19-After Before-20-After
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Όπως μπορείτε να δείτε, ο μηχανισμός επέκτασης αγκυλών επιτρέπει την παραγωγή τιμών βασισμένων σε μια ακολουθία - sequence που του ορίζουμε.&lt;/p&gt;

&lt;p&gt;Μάθετε περισσότερα για τον &lt;a href=&quot;https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html&quot;&gt;μηχανισμό επέκτασης αγκυλών εδώ&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;επεξήγηση-εντολής&quot;&gt;Επεξήγηση εντολής&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;τυπώνουμε τη φράση “now - x days” τόσες φορές όσες το πλήθος των τιμών που προκύπτουν από την ακολουθία - sequence&lt;/li&gt;
  &lt;li&gt;η ακολουθία &lt;code class=&quot;highlighter-rouge&quot;&gt;{1..332044}&lt;/code&gt; θα παράξει 332044 τιμές ξεκινώντας από το 1 αυξανόμενη κατά ένα κάθε φορά&lt;/li&gt;
  &lt;li&gt;προσθέτουμε μια νέα γραμμή στο τέλος του παραγόμενου λεκτικού&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;αποτελέσματα---output&quot;&gt;Αποτελέσματα - Output&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;now - 1 days
now - 2 days
now - 3 days
now - 4 days
now - 5 days
...
now - 332038 days
now - 332039 days
now - 332040 days
now - 332041 days
now - 332042 days
now - 332043 days
now - 332044 days
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;date--f--y_m_dnymd&quot;&gt;date -f- &lt;code class=&quot;highlighter-rouge&quot;&gt;+%Y%\_m%\_d$'\n'%Y%m%d&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Σε αυτό το τμήμα της εντολής χρησιμοποιούμε την εντολή &lt;code class=&quot;highlighter-rouge&quot;&gt;date&lt;/code&gt; για να μετατρέψουμε σε ημερομηνία την κάθε γραμμή του αποτελέσματος της προηγούμενης εντολής (της εντολής πριν τη σωλήνωση) και να τυπώσουμε δύο γραμμές για κάθε ημερομηνία, μια που θα γεμίσει τις μονοψήφιες ημέρες και τους μονοψήφιους μήνες με ένα μηδενικό και μια που θα γεμίσει τις μονοψήφιες ημέρες και τους μονοψήφιους μήνες με ένα κενό (space).&lt;/p&gt;

&lt;p&gt;Εξοικειωθείτε με την εντολή στη γραμμή εντολών:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Δείξε την τρέχουσα ημερομηνία = now&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;date
&lt;/span&gt;Thu Feb  6 07:30:10 EET 2020

&lt;span class=&quot;c&quot;&gt;# Δείξε τη χθεσινή ημερομηνία&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;now - 1 days&quot;&lt;/span&gt;
Wed Feb  5 07:31:22 EET 2020

&lt;span class=&quot;c&quot;&gt;# Δείξε τη χθεσινή ημερομηνία ως ηη/μμ/χχχχ (γέμισμα με μηδενικά)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;now - 1 days&quot;&lt;/span&gt; +%d/%m/%Y
05/02/2020

&lt;span class=&quot;c&quot;&gt;# Δείξε τη χθεσινή ημερομηνία ως ηη/μμ/χχχχ (γέμισμα με κενά)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;now - 1 days&quot;&lt;/span&gt; +%_d/%_m/%Y
 5/ 2/2020

&lt;span class=&quot;c&quot;&gt;# Δείξε τη χθεσινή ημερομηνία ως ηη/μμ/χχχχ (σωρίς γέμισμα)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;now - 1 days&quot;&lt;/span&gt; +%-d/%-m/%Y
5/2/2020
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;επεξήγηση-εντολής-1&quot;&gt;Επεξήγηση εντολής&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;χρησιμοποιούμε την επιλογή &lt;code class=&quot;highlighter-rouge&quot;&gt;-f&lt;/code&gt; για να ορίσουμε ότι η είσοδος της εντολής &lt;code class=&quot;highlighter-rouge&quot;&gt;date&lt;/code&gt; θα είναι οι γραμμές ενός αρχείου, ακολουθούμενη από μια παύλα (hyphen) &lt;code class=&quot;highlighter-rouge&quot;&gt;-&lt;/code&gt; για &lt;a href=&quot;https://unix.stackexchange.com/questions/16357/usage-of-dash-in-place-of-a-filename&quot;&gt;να ορίσουμε ότι το αρχείο αυτό είναι η τυπική είσοδος - &lt;code class=&quot;highlighter-rouge&quot;&gt;stdin&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;ορίζουμε τη μορφή των τυπωμένων τιμών (ό,τι ακολουθεί το σύμβολο &lt;code class=&quot;highlighter-rouge&quot;&gt;+&lt;/code&gt;) ώστε να είναι η αριθμητική αναπαράσταση του έτους (&lt;code class=&quot;highlighter-rouge&quot;&gt;%Y&lt;/code&gt;), του μήνα (γεμισμένου με κενά: &lt;code class=&quot;highlighter-rouge&quot;&gt;%_m&lt;/code&gt;, γεμισμένου με μηδενικά: &lt;code class=&quot;highlighter-rouge&quot;&gt;%m&lt;/code&gt;) και της ημέρας του μήνα (γεμισμένης με κενά: &lt;code class=&quot;highlighter-rouge&quot;&gt;%_d&lt;/code&gt;, γεμισμένης με μηδενικά: &lt;code class=&quot;highlighter-rouge&quot;&gt;%d&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;η μορφή με τα κενά είναι &lt;code class=&quot;highlighter-rouge&quot;&gt;%Y%\_m%\_d&lt;/code&gt; και η μορφή με τα μηδενικά &lt;code class=&quot;highlighter-rouge&quot;&gt;%Y%m%d&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;συνδυάζουμε αυτές &lt;strong&gt;τις δύο μορφές για κάθε μία ημερομηνία&lt;/strong&gt; ενώνοντάς τες με μια νέα γραμμή &lt;code class=&quot;highlighter-rouge&quot;&gt;$'\n'&lt;/code&gt; οπότε, για κάθε ημερομηνία παράγουμε δύο γραμμές, μια με μηδενικά και μια με κενά για τους μονοψήφιους μήνες και τις μονοψήφιες ημέρες του μήνα&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Σημείωση&lt;/strong&gt;: αντί να γεμίσουμε με κενά (χρησιμοποιώντας την κάτω παύλα &lt;code class=&quot;highlighter-rouge&quot;&gt;_&lt;/code&gt; στη μορφή), θα μπορούσαμε να χρησιμοποιήσουμε την παύλα &lt;code class=&quot;highlighter-rouge&quot;&gt;-&lt;/code&gt; ώστε &lt;strong&gt;να μη γεμίζουν με τίποτα οι μονοψήφιες τιμές&lt;/strong&gt;. Με αυτόν τον τρόπο δε θα χρειαζόταν να αφαιρέσουμε τα κενά όπως περιγράφεται στο επόμενο τμήμα.&lt;/p&gt;

&lt;h3 id=&quot;αποτέλεσμα---output&quot;&gt;Αποτέλεσμα - Output&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;2020 2 5
20200205
2020 2 4
20200204
2020 2 3
20200203
2020 2 2
20200202
2020 2 1
20200201
2020 131
20200131
2020 130
20200130
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;tr--d----alldatestxt-rev-alldatestxt-revdatestxt-paste-alldatestxt-revdatestxt&quot;&gt;tr -d ' ' &amp;gt; alldates.txt; rev alldates.txt &amp;gt;revdates.txt; paste alldates.txt revdates.txt&lt;/h2&gt;

&lt;p&gt;Σε αυτό το τμήμα αφαιρούμε τα κενά που παρήχθησαν προηγουμένως και δημιουργούμε δύο αρχεία, ένα με όλες τις ημερομηνίες ως έχουν και ένα με όλες τις ημερομηνίες αντεστραμμένες.&lt;/p&gt;

&lt;p&gt;Στη συνέχεια συγχωνεύουμε αυτά τα δύο αρχεία, ενώνοντας κάθε γραμμή του πρώτου αρχείου με την αντίστοιχη γραμμή του δεύτερου παρεμβάλλοντας ένα στηλοθέτη - TAB.&lt;/p&gt;

&lt;p&gt;Εξοικειωθείτε με τις εντολές στη γραμμή εντολών σας:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Αφαίρεσε τα κενά&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Good night &quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot; &quot;&lt;/span&gt;
Goodnight

&lt;span class=&quot;c&quot;&gt;# Αφαίρεσε τις παύλες&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Good-night&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;-&quot;&lt;/span&gt;
Goodnight

&lt;span class=&quot;c&quot;&gt;# Τύπωσε a-x-z όπου χ ένας αριθμός μεταξύ του 1 και του 9&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;a-%d-z&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;1..9&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
a-1-z
a-2-z
a-3-z
a-4-z
a-5-z
a-6-z
a-7-z
a-8-z
a-9-z

&lt;span class=&quot;c&quot;&gt;# και αντέστρεψε τη σειρά των χαρακτήρων της κάθε γραμμής&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;a-%d-z&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;1..9&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; | rev
z-1-a
z-2-a
z-3-a
z-4-a
z-5-a
z-6-a
z-7-a
z-8-a
z-9-a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;επεξήγηση-εντολής-2&quot;&gt;Επεξήγηση εντολής&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;tr -d ''&lt;/code&gt;: αφαιρούμε τα κενά από την είσοδο - input (που είναι η έξοδος - output της προηγούμενης εντολής) και αποθηκεύουμε την έξοδο σε ένα αρχείο με όνομα &lt;code class=&quot;highlighter-rouge&quot;&gt;alldates.txt&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;rev&lt;/code&gt;: αντιστρέφουμε του χαρακτήρες κάθε γραμμής του αρχείου &lt;code class=&quot;highlighter-rouge&quot;&gt;alldates.txt&lt;/code&gt; και αποθηκεύουμε την έξοδο σε ένα νέο αρχείο με όνομα &lt;code class=&quot;highlighter-rouge&quot;&gt;revdates.txt&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;paste&lt;/code&gt;: ενώνουμε τα δύο αρχεία; κάθε γραμμή του αρχείου &lt;code class=&quot;highlighter-rouge&quot;&gt;alldates.txt&lt;/code&gt; ενώνεται με την αντίστοιχη γραμμή του αρχείου &lt;code class=&quot;highlighter-rouge&quot;&gt;revdates.txt&lt;/code&gt; παρεμβάλλοντας ένα στηλοθέτη - tab (τα δύο αρχεία έχουν τον ίδιο αριθμό γραμμών).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;αποτελέσματα---output-1&quot;&gt;Αποτελέσματα - Output&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;202025	520202
20200205	50200202
202024	420202
20200204	40200202
202023	320202
20200203	30200202
202022	220202
20200202	20200202
202021	120202
20200201	10200202
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;awk-12print-1&quot;&gt;awk '$1==$2{print $1}'&lt;/h2&gt;

&lt;p&gt;Σε αυτό το τελευταίο τμήμα της εντολής, χρησιμοποιούμε την &lt;code class=&quot;highlighter-rouge&quot;&gt;awk&lt;/code&gt; για να τυπώσουμε τα παλίνδρομα.&lt;/p&gt;

&lt;p&gt;Εξοικειωθείτε με τη σχετική λειτουργικότητα της awk στη γραμμή εντολών σας:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Τύπωσε ολόκληρη την είσοδο (η προεπιλεγμένη συμπεριφορά της awk) αν τα πεδία είναι ίδια&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;a a&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'$1==$2'&lt;/span&gt;
a a

&lt;span class=&quot;c&quot;&gt;# Τύπωσε ολόκληρη την είσοδο (η προεπιλεγμένη συμπεριφορά της awk) αν τα πεδία είναι ίδια&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;a a&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'$1!=$2'&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# δεν τυπώνεται τίποτα εδώ&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Τύπωσε ολόκληρη την είσοδο (η προεπιλεγμένη συμπεριφορά της awk) αν τα πεδία είναι ίδια&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;a b&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'$1!=$2'&lt;/span&gt;
a b

&lt;span class=&quot;c&quot;&gt;# Τύπωσε το πρώτο πεδίο αν τα πεδία δεν είναι ίδια&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;a b&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'$1!=$2 {print $1}'&lt;/span&gt;
a

&lt;span class=&quot;c&quot;&gt;# Τύπωσε το δεύτερο πεδίο αν τα πεδία δεν είναι ίδια&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;a b&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'$1!=$2 {print $2}'&lt;/span&gt;
b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;επεξήγηση-εντολής-3&quot;&gt;Επεξήγηση εντολής&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;τα αποτελέσματα του προηγούμενου τμήματος της εντολής που είναι η είσοδος αυτού του τμήματος αποτελούνται από γραμμές και κάθε γραμμή έχει δύο τιμές χωρισμένες με στηλοθέτη - TAB. Αυτού του τύπου την είσοδο &lt;a href=&quot;https://www.gnu.org/software/gawk/manual/html_node/Fields.html&quot;&gt;η awk την διαβάζει ως δύο πεδία&lt;/a&gt; για κάθε γραμμή. Μπορούμε να προσπελάσουμε αυτά τα πεδία χρησιμοποιώντας της μεταβλητές &lt;code class=&quot;highlighter-rouge&quot;&gt;$1&lt;/code&gt; και &lt;code class=&quot;highlighter-rouge&quot;&gt;$2&lt;/code&gt; αντίστοιχα.&lt;/li&gt;
  &lt;li&gt;όπως περιγράφεται σε &lt;a href=&quot;https://iridakos.com/el/programming/2019/11/11/remove-duplicate-lines-preserving-order-linux#%CF%80%CF%89%CF%82-%CE%B4%CE%BF%CF%85%CE%BB%CE%B5%CF%8D%CE%B5%CE%B9&quot;&gt;προηγούμενο άρθρο μου&lt;/a&gt;, οι δηλώσεις (statements) στην &lt;strong&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;awk&lt;/code&gt;&lt;/strong&gt; αποτελούνται από ένα &lt;a href=&quot;http://kirste.userpage.fu-berlin.de/chemnet/use/info/gawk/gawk_9.html&quot;&gt;&lt;strong&gt;μοτίβο (pattern) ή έκφραση (expression)&lt;/strong&gt; και μια &lt;strong&gt;συσχετισμένη ενέργεια (associated action)&lt;/strong&gt;&lt;/a&gt;.
    &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;pattern/expression&amp;gt; { &amp;lt;action&amp;gt; }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;Αν το μοτίβο/έκφραση επιτύχει τότε εκτελείται η συσχετισμένη ενέργεια. Στην περίπτωσή μας, η έκφραση μεταφράζεται ως “αν τα δύο πεδία είναι ίδια” (&lt;code class=&quot;highlighter-rouge&quot;&gt;$1==$2&lt;/code&gt;) και η ενέργεια ως “τύπωσε το πρώτο πεδίο” (&lt;code class=&quot;highlighter-rouge&quot;&gt;printf $1&lt;/code&gt;).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;αν τα πεδία είναι ίδια τότε έχουμε μια παλίνδρομη ημερομηνία αφού κάθε ζεύγος πεδίων είναι η ημερομηνία και η αντίστροφη τιμή της.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;αποτελέσματα---output-2&quot;&gt;Αποτελέσματα - Output&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;20200202
2019102
2018102
2017102
2016102
2015102
2014102
2013102
2012102
...
11111111
11111111
1111111
1111111
111111
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;γατοφωτογραφία&quot;&gt;Γατοφωτογραφία&lt;/h2&gt;

&lt;p&gt;Τελειώσαμε, ευχαριστώ για την ανάγνωση.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/posts/palindrome-shell/post.jpg&quot; alt=&quot;Φωτογραφία με την αντανάκλαση της γάτας μου, της Ίριδας&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;αναφορές&quot;&gt;Αναφορές&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/climagic/status/1225056662949650432&quot;&gt;@climagic tweet this post is based on&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Palindrome&quot;&gt;Palindrome - Wikipedia&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html&quot;&gt;Bash brace expansion&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://unix.stackexchange.com/questions/16357/usage-of-dash-in-place-of-a-filename&quot;&gt;Using hyphen to set file input to stdin&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.gnu.org/software/gawk/manual/html_node/Fields.html&quot;&gt;Awk field resolution&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://iridakos.com/programming/2019/05/16/remove-duplicate-lines-preserving-order-linux#how-it-works&quot;&gt;Awk - Αποδιπλοποίηση των γραμμών ενός αρχείου διατηρώντας τη σειρά τους&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 10 Feb 2020 09:00:00 +0200</pubDate>
        <link>https://iridakos.com/el/programming/2020/02/10/shell-palindrome-dates</link>
        <guid isPermaLink="true">https://iridakos.com/el/programming/2020/02/10/shell-palindrome-dates</guid>
        
        <category>how-to</category>
        
        <category>linux</category>
        
        <category>opensource</category>
        
        <category>bash</category>
        
        <category>scripts</category>
        
        <category>awk</category>
        
        <category>climagic</category>
        
        
        <category>programming</category>
        
      </item>
    
      <item>
        <title>Bash: Προσθέτοντας tab συμπλήρωση στα script</title>
        <description>&lt;p&gt;Πρόσφατα χρειάστηκε να προσθέσω tab συμπλήρωση σε ένα &lt;a class=&quot;&quot; href=&quot;https://github.com/iridakos/goto&quot;&gt;script μου&lt;/a&gt; και βρήκα τη λειτουργικότητα πολύ ενδιαφέρουσα.&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;&quot; href=&quot;https://github.com/iridakos/goto&quot;&gt;
  &lt;img class=&quot;no-maximize&quot; src=&quot;/assets/images/posts/goto/goto.gif&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Σε αυτό το άρθρο θα εξοικειωθείτε με τη διαδικασία προσθήκης tab συμπλήρωσης στα script σας στη γραμμή εντολών του Bash.&lt;/p&gt;

&lt;h2 id=&quot;τι-είναι-η-tab-συμπλήρωση-bash-completion&quot;&gt;Τι είναι η tab συμπλήρωση (bash completion);&lt;/h2&gt;

&lt;p&gt;Η tab συμπλήρωση είναι μια λειτουργικότητα μέσω της οποίας το Bash επιτρέπει στους χρήστες να πληκτρολογήσουν τις εντολές τους πιο εύκολα και γρήγορα. Αυτό το πετυχαίνει με το να παρουσιάζει πιθανές επιλογές ως συνέχεια της εντολής όταν οι χρήστες πατούν το &lt;code class=&quot;highlighter-rouge&quot;&gt;tab&lt;/code&gt; πλήκτρο καθώς την γράφουν.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git&amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;
git                 git-receive-pack    git-upload-archive  
gitk                git-shell           git-upload-pack     
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git-s&amp;lt;tab&amp;gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git-shell
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;πως-δουλεύει&quot;&gt;Πως δουλεύει;&lt;/h3&gt;

&lt;p&gt;Το script συμπλήρωσης είναι κώδικας που χρησιμοποιεί την συστημική bash εντολή &lt;code class=&quot;highlighter-rouge&quot;&gt;complete&lt;/code&gt; για να ορίσει &lt;strong&gt;ποιες προτάσεις συμπλήρωσης&lt;/strong&gt; θα εμφανιστούν για ένα δεδομένο &lt;strong&gt;εκτελέσιμο&lt;/strong&gt; πρόγραμμα.
Η φύση των προτάσεων αυτών ποικίλει από απλές στατικές έως περίπλοκες και δυναμικές επιλογές.&lt;/p&gt;

&lt;h3 id=&quot;γιατί-να-ασχοληθώ&quot;&gt;Γιατί να ασχοληθώ;&lt;/h3&gt;

&lt;p&gt;Είναι καλό να παρέχεται αυτή η λειτουργικότητα στους χρήστες των script:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;για να διευκολύνεται η πληκτρολόγηση κειμένου όταν μπορεί να συμπληρωθεί αυτόματα&lt;/li&gt;
  &lt;li&gt;για να μπορούν να βλέπουν ποιες είναι οι πιθανές συνέχειες στις εντολές που πληκτρολογούν και&lt;/li&gt;
  &lt;li&gt;για την αποφυγή λαθών και για την βελτίωση της εμπειρίας τους κρύβοντας τις μη διαθέσιμες και εμφανίζοντας τις διαθέσιμες επιλογές βάσει του τι έχουν ήδη πληκτρολογήσει&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;ας-ξεκινήσουμε&quot;&gt;Ας ξεκινήσουμε&lt;/h2&gt;

&lt;p&gt;Να τι θα κάνουμε σε αυτό το βοήθημα.&lt;/p&gt;

&lt;p&gt;Αρχικά, θα δημιουργήσουμε ένα πολύ απλό εκτελέσιμο script που θα το πούμε &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt;. Αυτό θα είναι το script που στη συνέχεια θα προσθέσουμε τη λειτουργικότητα για την tab συμπλήρωση.
Το μόνο που θα κάνει το script είναι να εκτελεί την εντολή που βρίσκεται σε μια συγκεκριμένη θέση στο ιστορικό των εντολών του χρήστη. Τη θέση της εντολής στο ιστορικό θα την δέχεται σαν παράμετρο κατά την εκτέλεση. Για παράδειγμα, η παρακάτω εντολή θα εκτελέσει την εντολή &lt;code class=&quot;highlighter-rouge&quot;&gt;ls -a&lt;/code&gt; δεδομένου ότι η τελευταία βρισκεται στη θέση &lt;code class=&quot;highlighter-rouge&quot;&gt;235&lt;/code&gt; στο ιστορικό εντολών του χρήστη:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dothis 235
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Στη συνέχεια θα δημιουργήσουμε το script tab συμπλήρωσης που θα εμφανίζει τις εντολές μαζί με τη θέση τους, από το &lt;code class=&quot;highlighter-rouge&quot;&gt;ιστορικό εντολών του χρήστη&lt;/code&gt; και τέλος θα το συνδέσουμε με το πρόγραμμα &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt; που προανέφερα.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis &amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;
215 &lt;span class=&quot;nb&quot;&gt;ls
&lt;/span&gt;216 &lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-la&lt;/span&gt;
217 &lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ~
218 man &lt;span class=&quot;nb&quot;&gt;history
&lt;/span&gt;219 git status
220 &lt;span class=&quot;nb&quot;&gt;history&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;cut&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; 8-
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/posts/bash-completion/bash-completion-tutorial.gif&quot; alt=&quot;Επίδειξη της tab συμπλήρωσης&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Συγκεντρωθείτε &lt;code class=&quot;highlighter-rouge&quot;&gt;bash&lt;/code&gt; και τα καταφέρουμε με την πρώτη.&lt;/p&gt;

&lt;h3 id=&quot;δημιουργία-του-εκτελέσιμου-προγράμματος&quot;&gt;Δημιουργία του εκτελέσιμου προγράμματος&lt;/h3&gt;

&lt;p&gt;Δημιουργήστε ένα αρχείο με το όνομα &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt; στο φάκελο που επιθυμείτε και προσθέστε τον παρακάτω κώδικα:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-z&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;No command number passed&quot;&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;2
&lt;span class=&quot;k&quot;&gt;fi

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;exists&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;fc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-1000&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; ^&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$exists&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;fc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;else
  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Command with number &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; was not found in recent history&quot;&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;2
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Σημειώσεις:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Πρώτα ελέγχουμε αν το πρόγραμμα κλήθηκε με παράμετρο&lt;/li&gt;
  &lt;li&gt;Στη συνέχεια ελέγχουμε αν ο συγκεκριμένος αριθμός αντιστοιχεί σε κάποια από τις τελευταίες 1000 εντολές του ιστορικού του χρήστη.
    &lt;ul&gt;
      &lt;li&gt;αν ναι τότε την εκτελούμε με χρήση της εντολής &lt;code class=&quot;highlighter-rouge&quot;&gt;fc&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;διαφορετικά εμφανίζουμε ένα μήνυμα λάθους&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Μετατρέψτε το script σε εκτελέσιμο με την παρακάτω εντολή:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;chmod&lt;/span&gt; +x ./dothis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Θα εκτελούμε συχνά αυτό το script σε αυτό το βοήθημα οπότε συνιστώ να το μεταφέρετε σε ένα φάκελο που ανήκει στην μεταβλητή &lt;a href=&quot;http://www.linfo.org/path_env_var.html&quot;&gt;PATH&lt;/a&gt; του περιβάλλοντός σας ωτε να μπορούμε να το προσπελάσουμε από παντού απλά πληκτρολογώντας &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Το δικό μου το έβαλα στο &lt;code class=&quot;highlighter-rouge&quot;&gt;home bin&lt;/code&gt; πληκτρολογώντας:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; ./dothis ~/bin/dothis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Μπορείτε να κάνετε το ίδιο δεδομένου ότι έχετε φάκελο &lt;code class=&quot;highlighter-rouge&quot;&gt;~/bin&lt;/code&gt; ο οποίος εμπεριέχεται στην &lt;code class=&quot;highlighter-rouge&quot;&gt;PATH&lt;/code&gt; μεταβλητή σας.&lt;/p&gt;

&lt;p&gt;Δοκιμάστε να δείτε ότι δουλεύει:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dothis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Θα έπρεπε να δείτε αυτό:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis
No &lt;span class=&quot;nb&quot;&gt;command &lt;/span&gt;number passed
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;h3 id=&quot;δημιουργία-του-script-tab-συμπλήρωσης&quot;&gt;Δημιουργία του script tab συμπλήρωσης&lt;/h3&gt;

&lt;p&gt;Δημιουργήστε ένα αρχείο με όνομα &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis-completion.bash&lt;/code&gt;. Από εδώ και στο εξής θα αναφέρομαι στο αρχείο αυτό με τον όρο &lt;strong&gt;script συμπλήρωσης&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Αφού του προσθέσουμε κώδικα, θα εκτελέσουμε την εντολή &lt;code class=&quot;highlighter-rouge&quot;&gt;source&lt;/code&gt; για να το “ενεργοποιήσουμε”.
Θα εκτελούμε την &lt;code class=&quot;highlighter-rouge&quot;&gt;source&lt;/code&gt; σε αυτό το αρχείο &lt;strong&gt;κάθε φορά που αλλάζουμε το περιεχόμενό του ώστε να ισχύουν οι αλλαγές&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Θα συζητήσουμε επιλογές ώστε να να γίνεται η ενεργοποίηση αυτή κάθε φορά που ανοίγει νέα bash κονσόλα &lt;a href=&quot;#αυτόματη-ενεργοποίηση-του-script-tab-συμπλήρωσης&quot;&gt;αργότερα&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;στατική-συμπλήρωση&quot;&gt;Στατική συμπλήρωση&lt;/h4&gt;

&lt;p&gt;Υποθέστε ότι το &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt; υποστήριζε μια στατική λίστα από παραμέτρους, για παράδειγμα:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;τώρα&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;αύριο&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ποτέ&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Θα χρησιμοποιήσουμε την εντολή &lt;code class=&quot;highlighter-rouge&quot;&gt;complete&lt;/code&gt; για να καταχωρήσουμε αυτή τη λίστα ως επιλογές για tab συμπλήρωση. (Για να χρησιμοποιήσουμε τη σωστή ορολογία, θα χρησιμοποιήσουμε την εντολή &lt;code class=&quot;highlighter-rouge&quot;&gt;complete&lt;/code&gt; για να ορίσουμε τις προδιαγραφές συμπλήρωσης (&lt;strong&gt;compspec&lt;/strong&gt;) για το πρόγραμμά μας.)&lt;/p&gt;

&lt;p&gt;Προσθέστε αυτά στο script συμπλήρωσης.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#/usr/bin/env bash&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;complete&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-W&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;τώρα αύριο ποτέ&quot;&lt;/span&gt; dothis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Τι κάναμε με τη χρήση της παραπάνω εντολής &lt;code class=&quot;highlighter-rouge&quot;&gt;complete&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;χρησιμοποιήσαμε την επιλογή &lt;code class=&quot;highlighter-rouge&quot;&gt;-W&lt;/code&gt; (&lt;em&gt;wordlist&lt;/em&gt;) για να παρέχουμε τη λίστα που θα χρησιμοποιηθεί για συμπλήρωση&lt;/li&gt;
  &lt;li&gt;ορίσαμε σε ποιο πρόγραμμα αυτή η λίστα θα παρέχεται για tab συμπλήρωση (η τελευταία παράμετρος: &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Ενεργοποιήστε” το αρχείο (δεν βρήκα πιο δόκιμο όρο για να περιγράψω τη σημασία της εκτέλεσης της εντολής “source”):&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; ./dothis-completion.bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Τώρα προσπαθήστε να πατήσετε το πλήκτρο tab δύο φορές όπως παρακάτω:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis &amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;
αύριο ποτέ τώρα
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Προσπαθήστε ξανά αφού βάλετε και ένα &lt;code class=&quot;highlighter-rouge&quot;&gt;τ&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis τ&amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;
τώρα
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Magic! Οι επιλογές συμπλήρωσης φιλτράρονται αυτόματα ώστε να εμφανιστούν μόνο αυτές που ξεκινούν από &lt;code class=&quot;highlighter-rouge&quot;&gt;τ&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Σημείωση:&lt;/strong&gt;
Οι επιλογές συμπλήρωσης δεν εμφανίζονται με τη σειρά που τις ορίσαμε στη λίστα λέξεων, ταξινομούνται αυτόματα.&lt;/p&gt;

&lt;p&gt;Υπάρχουν πολλές άλλες επιλογές πέραν της &lt;code class=&quot;highlighter-rouge&quot;&gt;-W&lt;/code&gt; που χρησιμοποιήσαμε προηγουμένως. Οι περισσότερες παράγουν συμπληρώσεις με στατικό τρόπο, εννοώντας ότι δεν επεμβαίνουμε δυναμικά στο φιλτράρισμα τους.&lt;/p&gt;

&lt;p&gt;Για παράδειγμα, αν θέλαμε να έχουμε ως tab συμπληρώσεις για το εκτελέσιμο &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt; τους φακέλους που βρίσκονται στον τρέχων φάκελο, θα αλλάζαμε την εντολή ως εξής:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;complete&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt; directory dothis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Πατώντας το tab μετά το &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt;, θα λαμβάναμε μια λίστα σαν την παρακάτω:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis &amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;
dir1/ dir2/ dir3/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Βρείτε ολόκληρη τη λίστα με τις διαθέσιμες επιλογές &lt;a href=&quot;https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html#Programmable-Completion-Builtins&quot;&gt;εδώ&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;δυναμική-tab-συμπλήρωση&quot;&gt;Δυναμική tab συμπλήρωση&lt;/h4&gt;

&lt;p&gt;Θέλουμε να παράγουμε τις προτάσεις συμπλήρωσης για το εκτελέσιμο script μας με την ακόλουθη λογική:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;αν ο χρήστης πατήσει το tab αμέσως μετά την εντολή, θα δείχνουμε τις τελευταίες 50 εκτελεσθείσες εντολές μαζί με τον αριθμό που αντιστοιχεί στη θέση τους στο ιστορικό&lt;/li&gt;
  &lt;li&gt;αν ο χρήστης πατήσει το tab αφού έχει πληκτρολογήσει και έναν αριθμό τότε θα εμφανίζουμε όλες τις εντολές των οποίων η θέση στο ιστορικό του, είναι ή ξεκινά με αυτόν τον αριθμό&lt;/li&gt;
  &lt;li&gt;αν ο χρήστης πατήσει το tab αφού έχει πληκτρολογήσει και έναν αριθμό και υπάρχει μόνο μια εντολή με θέση που είναι ή ξεκινά με τον αριθμό αυτό τότε θα συμπληρώσουμε απευθείας όλο τον αριθμό (αν έχετε μπερδευτεί μην ανησυχείτε, θα ξεκαθαρίσουν όλα παρακάτω)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ας ξεκινήσουμε με το να ορίσουμε μια μέθοδο που θα εκτελείται κάθε φορά που ο χρήστης θα “ζητά” προτάσεις συμπλήρωσης για την εντολή &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt; (πατώντας το tab). Αλλάξτε το script συμπλήρωσης ως εξής:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#/usr/bin/env bash&lt;/span&gt;
_dothis_completions&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  COMPREPLY+&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;τώρα&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  COMPREPLY+&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;αύριο&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  COMPREPLY+&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ποτέ&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;complete&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; _dothis_completions dothis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Σημειώστε τα παρακάτω:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;χρησιμοποιήσαμε την επιλογή &lt;code class=&quot;highlighter-rouge&quot;&gt;-F&lt;/code&gt; στην εντολή &lt;code class=&quot;highlighter-rouge&quot;&gt;complete&lt;/code&gt; ορίζοντας ότι η &lt;code class=&quot;highlighter-rouge&quot;&gt;_dothis_completions&lt;/code&gt; είναι η μέθοδος που θα παρέχει τις προτάσεις συμπλήρωσης για το &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt; εκτελέσιμο&lt;/li&gt;
  &lt;li&gt;η &lt;code class=&quot;highlighter-rouge&quot;&gt;COMPREPLY&lt;/code&gt; είναι μια μεταβλητή τύπου &lt;strong&gt;πίνακα&lt;/strong&gt; που χρησιμοποιείται για να αποθηκεύει τις προτάσεις συμπλήρωσης - ο μηχανισμός συμπλήρωσης χρησιμοποιεί τη συγκεκριμένη μεταβλητή για να εμφανίσει τα περιεχόμενά της ως προτάσεις συμπλήρωσης&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Τώρα, ενεργοποιήστε το script συμπλήρωσης και κατόπιν δοκιμάστε να πατήσετε tab μετά το εκτελέσιμο &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis &amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;
αύριο ποτέ τώρα
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Τέλεια. Παράγουμε τις ίδιες προτάσεις συμπλήρωσης όπως πριν που χρησιμοποιήσαμε την επιλογή &lt;code class=&quot;highlighter-rouge&quot;&gt;-W&lt;/code&gt;. Ή μήπως όχι; Δοκιμάστε το παρακάτω:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis ποτ&amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;
αύριο τώρα ποτέ
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Όπως βλέπετε, παρόλου που έχουμε πληκτρολογήσει &lt;strong&gt;ποτ&lt;/strong&gt; και μετά ζητήσαμε προτάσεις συμπλήρωσης πατώντας το &lt;code class=&quot;highlighter-rouge&quot;&gt;tab&lt;/code&gt;, οι διαθέσιμες προτάσεις συμπλήρωσης παραμένουν οι ίδιες, αφιλτράριστες και τίποτα δε συμπληρώνεται αυτόματα (κανονικά θα έπρεπε κατευθείαν να συμπληρωθεί η λέξη &lt;code class=&quot;highlighter-rouge&quot;&gt;ποτέ&lt;/code&gt; χωρίς καν να εμφανιστούν προτάσεις συμπλήρωσης αφού είναι η μόνη επιλογή που ξεκινά από &lt;code class=&quot;highlighter-rouge&quot;&gt;ποτ&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Γιατί συμβαίνει αυτό;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Τα περιεχόμενα της μεταβλητής &lt;code class=&quot;highlighter-rouge&quot;&gt;COMPREPLY&lt;/code&gt; εμφανίζονται πάντα. Η μέθοδος είναι υπεύθυνη να προσθέτει/αφαιρεί προτάσεις από εδώ και στο εξής.&lt;/li&gt;
  &lt;li&gt;Αν η &lt;code class=&quot;highlighter-rouge&quot;&gt;COMPREPLY&lt;/code&gt; μεταβλητή είχε μόνο ένα στοιχείο τότε η λέξη θα συμπληρωνόταν αυτόματα στην εντολή &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt;. Εφόσον η τρέχουσα υλοποίησή μας πάντα αποθηκεύει στη μεταβλητή τις ίδιες τρεις λέξεις, αυτό δε θα συμβεί.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Θα μας σώσει η &lt;code class=&quot;highlighter-rouge&quot;&gt;compgen&lt;/code&gt;: μια συστημική εντολή που παράγει προτάσεις συμπλήρωσης υποστηρίζοντας σχεδόν όλλες τις επιλογές που υποστηρίζει και η συστημική εντολή &lt;code class=&quot;highlighter-rouge&quot;&gt;complete&lt;/code&gt; που χρησιμοποιούσαμε ως τώρα (πχ. &lt;code class=&quot;highlighter-rouge&quot;&gt;-W&lt;/code&gt; για λίστα λέξεων, &lt;code class=&quot;highlighter-rouge&quot;&gt;-d&lt;/code&gt; για φακέλους) και φιλτράρει τις προτάσεις βάσει του τι έχει ήδη πληκτρολογηθεί από το χρήστη.&lt;/p&gt;

&lt;p&gt;Και πάλι, μην ανησυχείτε αν έχετε μπερδευτεί, τα πάντα θα ξεκαθαρίσουν παρακάτω.&lt;/p&gt;

&lt;p&gt;Πληκτρολογήστε τα παρακάτω στη γραμμή εντολών για να κατανοήσετε καλύτερα τη κάνει η &lt;code class=&quot;highlighter-rouge&quot;&gt;compgen&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;compgen&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-W&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;τώρα αύριο ποτέ&quot;&lt;/span&gt;
αύριο
τώρα
ποτέ
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;compgen&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-W&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;τώρα αύριο ποτέ&quot;&lt;/span&gt; τ
τώρα
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;compgen&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-W&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;τώρα αύριο ποτέ&quot;&lt;/span&gt; α
αύριο
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Οπότε τώρα μπορούμε να χρησιμοποιήσουμε την &lt;code class=&quot;highlighter-rouge&quot;&gt;compgen&lt;/code&gt; αλλά πρέπει να βρούμε πρώτα τι έχει πληκτρολογήσει ο χρήστης μετά το &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt;.
Η λειτουργικότητα tab συμπλήρωσης ευτυχώς παρέχει &lt;a href=&quot;https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#Bash-Variables&quot;&gt;μεταβλητές&lt;/a&gt; που σχετίζονται με την συμπλήρωση που είναι υπό εκτέλεση. Παραθέτω τις πιο σημαντικές:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;COMP_WORDS&lt;/code&gt;: ένας πίνακας με όλες τις λέξεις που έχουν πληκτρολογηθεί μετά από το όνομα του εκτελέσιμου στο οποίο έχει συνδεθεί το &lt;code class=&quot;highlighter-rouge&quot;&gt;compspec&lt;/code&gt; (στην περίπτωσή μας: όλες τις λέξεις που έχουν πληκτρολογηθεί μετά το &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;COMP_CWORD&lt;/code&gt;: ένας αριθμός που δείχνει σε ποια θέση του πίνακα &lt;code class=&quot;highlighter-rouge&quot;&gt;COMP_WORDS&lt;/code&gt; βρίσκεται ο κέρσορας - με άλλα λόγια, σε ποια λέξη ήταν ο κέρσορας όταν πατήθηκε το tab&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;COMP_LINE&lt;/code&gt;: ολόκληρη η τρέχουσα εντολή&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Για να προσπελάσουμε την λέξη που πληκτρολογήθηκε αμέσως μετά το &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt; αρκεί να χρησιμοποιήσουμε την τιμή του &lt;code class=&quot;highlighter-rouge&quot;&gt;COMP_WORDS[1]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Αλλάξτε το script συμπλήρωσης ξανά:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#/usr/bin/env bash&lt;/span&gt;
_dothis_completions&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;COMPREPLY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;compgen&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-W&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;τώρα αύριο ποτέ&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMP_WORDS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[1]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;complete&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; _dothis_completions dothis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ενεργοποιήστε το και ορίστε:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis
αύριο     τώρα       ποτέ
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis α
αύριο
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Τώρα, αντί των λέξεων &lt;em&gt;τώρα, αύριο, ποτέ&lt;/em&gt;, Θα θέλαμε να δούμε τους αριθμούς που είναι στην ουσία οι θέσεις των εντολών από το ιστορικό του χρήστη.&lt;/p&gt;

&lt;p&gt;Η εντολή &lt;code class=&quot;highlighter-rouge&quot;&gt;fc -l&lt;/code&gt; ακολουθούμενη από έναν αρνητικό αριθμό &lt;code class=&quot;highlighter-rouge&quot;&gt;-n&lt;/code&gt; εμφανίζει τις τελευταίες &lt;strong&gt;n&lt;/strong&gt; εντολές που εκτελέστηκαν.
Οπότε θα την χρησιμοποιήσουμε ως εξής:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;fc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-50&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;εμφανίζοντας τις τελευταίες &lt;strong&gt;50&lt;/strong&gt; εντολές μαζί με τον αριθμό της θέσης τους στο ιστορικό. Ο μόνος χειρισμός που πρέπει να κάνουμε είναι να αντικαταστήσουμε τα tabs με κενά διαστήματα ώστε να εμφανίζονται σωστά από τον μηχανισμό των συμπληρώσεων του Bash.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;sed&lt;/code&gt; βόηθα μας.&lt;/p&gt;

&lt;p&gt;Αλλάξτε το script συμπλήρωσης ως εξής:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#/usr/bin/env bash&lt;/span&gt;
_dothis_completions&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;COMPREPLY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;compgen&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-W&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;fc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-50&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s/\t//'&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMP_WORDS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[1]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;complete&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; _dothis_completions dothis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ενεργοποιήστε το script συμπλήρωσης και δοκιμάστε στη γραμμή εντολών:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis &amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;
632 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash   649 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash   666 &lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; ~/.bash_profile
633 clear                           650 clear                           667 &lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; ~/.bashrc
634 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash   651 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash   668 clear
635 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash   652 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash   669 &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; ./dothis ~/bin/dothis
636 clear                           653 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash   670 dothis
637 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash   654 clear                           671 dothis 6546545646
638 clear                           655 dothis 654                      672 clear
639 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash   656 dothis 631                      673 dothis
640 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash   657 dothis 150                      674 dothis 651
641 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash   658 dothis                          675 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash
642 clear                           659 clear                           676 dothis 651
643 dothis 623  &lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-la&lt;/span&gt;              660 dothis                          677 dothis 659
644 clear                           661 &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; ./dothis ~/bin/dothis   678 clear
645 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash   662 dothis                          679 dothis 665
646 clear                           663 &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; ./dothis ~/bin/dothis   680 clear
647 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash   664 dothis                          681 clear
648 clear                           665 &lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Καθόλου κακό.&lt;/p&gt;

&lt;p&gt;Έχουμε ένα πρόβλημα ωστόσο. Προσπαθήστε να πληκτρολογήσετε έναν αριθμό όπως τον βλέπετε στις προτάσεις συμπλήρωσης και πατήστε το tab ξανά.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis 623&amp;lt;tab&amp;gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis 623  &lt;span class=&quot;nb&quot;&gt;ls &lt;/span&gt;623  &lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-la&lt;/span&gt;
...
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis 623  &lt;span class=&quot;nb&quot;&gt;ls &lt;/span&gt;623  &lt;span class=&quot;nb&quot;&gt;ls &lt;/span&gt;623  &lt;span class=&quot;nb&quot;&gt;ls &lt;/span&gt;623  &lt;span class=&quot;nb&quot;&gt;ls &lt;/span&gt;623  &lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-la&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Αυτό συμβαίνει γιατί στο script συμπλήρωσής μας χρησιμοποιήσαμε την τιμή της &lt;code class=&quot;highlighter-rouge&quot;&gt;${COMP_WORDS[1]}&lt;/code&gt; ώστε να ελέγχουμε την πρώτη πάντα λέξη που πληκτρολογήθηκε μετά το &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt; (ο αριθμός &lt;code class=&quot;highlighter-rouge&quot;&gt;623&lt;/code&gt; στην παραπάνω απόσπασμα). Οπότε ο μηχανισμός συμπλήρωσης συνεχίζει να προτείνει ξανά και ξανά την ίδια επιλογή πατώντας το tab.&lt;/p&gt;

&lt;p&gt;Για να το διορθώσουμε αυτό, δε θα επιτρέπουμε κανένα είδος συμπλήρωσης να λάβει χώρα αν τουλάχιστον μια λέξη έχει ήδη συμπληρωθεί. Θα προσθέσουμε λοιπόν μια συνθήκη ελέγχοντας το μέγεθος της προαναφερθείσας &lt;code class=&quot;highlighter-rouge&quot;&gt;COMP_WORDS&lt;/code&gt; μεταβλητής.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#/usr/bin/env bash&lt;/span&gt;
_dothis_completions&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${#&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMP_WORDS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;2&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
    return
  fi

  &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMPREPLY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;compgen&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-W&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;fc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-50&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s/\t//'&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMP_WORDS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[1]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;complete&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; _dothis_completions dothis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ενεργοποιήστε το script συμπλήρωσης και ξαναδοκιμάστε.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis 623&amp;lt;tab&amp;gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis 623 &lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-la&lt;/span&gt;&amp;lt;tab&amp;gt; &lt;span class=&quot;c&quot;&gt;# Επιτυχία, δεν συμβαίνει συμπλήρωση εδώ&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Υπάρχει ωστόσο και κάτι άλλο που δε μας αρέσει. Θέλουμε να εμφανίζουμε τις θέσεις μαζί με τις αντίστοιχες εντολές ώστε να βοηθήσουμε τους χρήστες να αποφασίσουν ποια είναι η εντολή που θέλουν να εκτελέσουν αλλά όταν υπάρχει μόνο μια πρόταση συμπλήρωσης και ο μηχανισμός τη συμπληρώνει αυτόματα, &lt;strong&gt;δεν θα έπρεπε να συμπληρώνεται και η εντολή παρά μόνο ο αριθμός&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Με άλλα λόγια, το &lt;code class=&quot;highlighter-rouge&quot;&gt;dothis&lt;/code&gt; δέχεται μόνο έναν αριθμό και δεν έχουμε προσθέσει ελέγχους για περισσότερες παραμέτρους. Όταν μέθοδος που υπολογίζει τις προτάσεις συμπληρώσεων βρίσκε μόνο ένα αποτέλεσμα τότε θα πρέπει να πετσοκόψουμε (trim :D) το λεκτικό που περιέχει τον αριθμό και την εντολή ώστε να μείνει μόνο ο αριθμός.&lt;/p&gt;

&lt;p&gt;Για να το πετύχουμε αυτό, θα κρατήσουμε το αποτέλεσμα τις εντολής &lt;code class=&quot;highlighter-rouge&quot;&gt;compgen&lt;/code&gt; σε μια μεταβλητή τύπου πίνακα, και αν το μέγεθος της είναι &lt;strong&gt;1&lt;/strong&gt; τότε θα επεξεργαστούμε το μοναδικό στοιχείο της ώστε να μείνει μόνο ο αριθμός. Διαφορετικά θα αφήσουμε την μεταβλητή ως έχει.&lt;/p&gt;

&lt;p&gt;Αλλάξτε το script συμπλήρωσης ως εξής:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#/usr/bin/env bash&lt;/span&gt;
_dothis_completions&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${#&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMP_WORDS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;2&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
    return
  fi&lt;/span&gt;

  &lt;span class=&quot;c&quot;&gt;# keep the suggestions in a local variable&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;local &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;compgen&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-W&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;fc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-50&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s/\t/ /'&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMP_WORDS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[1]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${#&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;1&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# if there's only one match, we remove the command literal&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# to proceed with the automatic completion of the number&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;local &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[0]/%\ */&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;COMPREPLY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$number&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# more than one suggestions resolved,&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# respond with the suggestions intact&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;COMPREPLY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;complete&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; _dothis_completions dothis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;αυτόματη-ενεργοποίηση-του-script-tab-συμπλήρωσης&quot;&gt;Αυτόματη ενεργοποίηση του script tab συμπλήρωσης&lt;/h3&gt;

&lt;p&gt;Αν θέλετε να ενεργοποιήσετε τις συμπληρώσεις για το εκτελέσιμο &lt;strong&gt;μόνο για εσάς&lt;/strong&gt;, το μόνο που χρειάζεται να κάνετε είναι να προσθέσετε της παρακάτω εντολή στο αρχείο σας &lt;code class=&quot;highlighter-rouge&quot;&gt;~/.bashrc&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; &amp;lt;path-to-your-script&amp;gt;/dothis-completion.bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Αν θέλετε να τις ενεργοποιήσετε για όλους τους χρήστες τότε μπορείτε να αντιγράψετε το script συμπλήρωσης στο φάκελο &lt;code class=&quot;highlighter-rouge&quot;&gt;/etc/bash_completion.d/&lt;/code&gt; και θα φορτώνεται αυτόματα από το Bash.&lt;/p&gt;

&lt;h3 id=&quot;τελειοποίηση-του-script-συμπλήρωσης&quot;&gt;Τελειοποίηση του script συμπλήρωσης&lt;/h3&gt;

&lt;p&gt;Μερικά επιπλέον βήματα για καλύτερα αποτελέσματα.&lt;/p&gt;

&lt;h4 id=&quot;εμφανίζοντας-κάθε-πρόταση-συμπλήρωσης-σε-νέα-γραμμή&quot;&gt;Εμφανίζοντας κάθε πρόταση συμπλήρωσης σε νέα γραμμή&lt;/h4&gt;

&lt;p&gt;Στο script συμπλήρωσης που χρειάστηκε να δημιουργήσω, επίσης έπρεπε να εμφανίζω προτάσεις που αποτελούνταν από δύο τμήματα. Ήθελα να εμφανίζω το πρώτο τμήμα με το εξ ορισμού χρώμα των γραμμάτων της κονσόλας και το δεύτερο τμήμα με γκρι χρώμα ώστε να φαίνεται ότι ήταν απλά βοηθητικό κείμενο. Στο παράδειγμά μας, θα ήταν ωραίο να παρουσιάζουμε τους αριθμούς με το εξ ορισμού χρώμα αλλά το χρώμα των εντολών να ήταν κάτι λιγότερο χτυπητό στο μάτι.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Δυστυχώς&lt;/strong&gt;, αυτό δεν είναι δυνατόν (τουλάχιστον για την ώρα) γιατί ο μηχανισμός συμπλήρωσης εμφανίζει τις προτάσεις ως καθαρό κείμενο και οι οδηγίες χρώματος δεν εφαρμόζονται (για παράδειγμα, αυτό &lt;code class=&quot;highlighter-rouge&quot;&gt;\e[34mουρανός&lt;/code&gt; θα εμφανιζόταν ακριβώς όπως το βλέπετε και όχι η λέξη ουρανός σε μπλε χρώμα).&lt;/p&gt;

&lt;p&gt;Αυτό που μπορούμε ωστόσο να κάνουμε για να βελτιώσουμε την εμπειρία των χρηστών (ή όχι :D) είναι να εμφανίζουμε την κάθε πρόταση συμπλήρωσης σε νέα γραμμή. Ο τρόπος για να το κάνουμε αυτό δεν είναι ο προφανής γιατί δεν μπορούμε απλά να προσθέσουμε στο τέλος κάθε πρότασης τον χαρακτήρα αλλαγής γραμμής αφού ο μηχανισμός συμπλήρωσης δεν θα τον μεταφράσει σε αλλαγή γραμμής αλλά θα τον δείξει ως κείμενο (&lt;code class=&quot;highlighter-rouge&quot;&gt;\n&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Θα ακολουθήσουμε ένα μάλλον &lt;a href=&quot;https://unix.stackexchange.com/questions/166908/is-there-anyway-to-get-compreply-to-be-output-as-a-vertical-list-of-words-instea&quot;&gt;hackish&lt;/a&gt; τρόπο και θα προσθέτουμε κενά στο τέλος κάθε πρότασης συμπλήρωσης, τόσα ώστε το τελικό πλήθος των χαρακτήρων της πρότασης (με τα κενά) να είναι ίσο με το πλήθος των χαρακτήρων που χωρά η κάθε γραμμή της κονσόλας.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;printf&lt;/code&gt; βόηθα μας.&lt;/p&gt;

&lt;p&gt;Αλλάξτε το script συμπλήρωσης ως εξής:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#/usr/bin/env bash&lt;/span&gt;
_dothis_completions&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${#&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMP_WORDS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;2&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
    return
  fi

  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;local &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;IFS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;$'&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;local &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;compgen&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-W&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;fc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-50&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s/\t//'&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMP_WORDS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[1]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${#&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;1&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;local &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[0]/%\ */&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;COMPREPLY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$number&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;else
    for &lt;/span&gt;i &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;!suggestions[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
      &lt;/span&gt;suggestions[&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'%*s'&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$COLUMNS&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;  &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;done

    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMPREPLY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;complete&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; _dothis_completions dothis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ενεργοποιήστε το και δοκιμάστε:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dothis &amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;
...
499 &lt;span class=&quot;nb&quot;&gt;source &lt;/span&gt;dothis-completion.bash                   
500 clear
...       
503 dothis 500
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;h4 id=&quot;προσαρμόσιμη-συμπεριφορά&quot;&gt;Προσαρμόσιμη συμπεριφορά&lt;/h4&gt;

&lt;p&gt;Στην περίπτωσή μας, ορίσαμε καρφωτά να εμφανίζονται οι τελευταίες 50 εκτελέσιμες εντολές όταν πατιέται το tab χωρίς να έχει πληκτρολογηθεί κάποιος αριθμός. Θα ήταν καλύτερο να αφήνουμε το χρήστη να επιλέγει πόσες θέλει να είναι αυτές οι εντολές (π.χ. οι τελευταίες 100) και αν δεν έχει ορίσει την επιθυμία του τότε εξ ορισμού να δείχνουμε τις τελευταίες 50,&lt;/p&gt;

&lt;p&gt;Για να το πετύχουμε αυτό, θα ελέγχουμε την τιμή μιας μεταβλητής από το περιβάλλον του χρήστη, ας πούμε &lt;code class=&quot;highlighter-rouge&quot;&gt;DOTHIS_COMPLETION_COMMANDS_NUMBER&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Αλλάξτε για τελευταία φορά το script συμπλήρωσης:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#/usr/bin/env bash&lt;/span&gt;
_dothis_completions&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${#&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMP_WORDS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;2&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
    return
  fi

  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;local &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;commands_number&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DOTHIS_COMPLETION_COMMANDS_NUMBER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;local &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;IFS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;$'&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;local &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;compgen&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-W&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;fc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; -&lt;span class=&quot;nv&quot;&gt;$commands_number&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s/\t//'&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMP_WORDS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[1]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${#&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;1&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;local &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[0]/%\ */&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;COMPREPLY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$number&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;else
    for &lt;/span&gt;i &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;!suggestions[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
      &lt;/span&gt;suggestions[&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'%*s'&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$COLUMNS&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;  &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;done

    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMPREPLY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;suggestions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;complete&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; _dothis_completions dothis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ενεργοποιήστε το και δοκιμάστε:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DOTHIS_COMPLETION_COMMANDS_NUMBER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;5
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;dothis &amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;
505 clear
506 &lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; ./dothis-completion.bash
507 dothis clear
508 clear
509 &lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DOTHIS_COMPLETION_COMMANDS_NUMBER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;5
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;χρήσιμοι-σύνδεσμοι&quot;&gt;Χρήσιμοι σύνδεσμοι&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/iridakos/goto/blob/master/goto.sh&quot;&gt;Το script συμπλήρωσης που ήταν η αφορμή για να γράψω αυτό το άρθρο (&lt;code class=&quot;highlighter-rouge&quot;&gt;goto&lt;/code&gt;)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/git/git/blob/master/contrib/completion/git-completion.bash&quot;&gt;Το script συμπλήρωσης του Git&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html#Programmable-Completion&quot;&gt;Bash Reference Manual: Programmable Completion&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html#Programmable-Completion-Builtins&quot;&gt;Bash Reference Manual: Programmable Completion Builtins&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.gnu.org/software/bash/manual/html_node/A-Programmable-Completion-Example.html#A-Programmable-Completion-Example&quot;&gt;Bash Reference Manual: A Programmable Completion Example&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#Bash-Variables&quot;&gt;Bash Reference Manual: Bash Variables&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;κώδικας-και-σχόλια&quot;&gt;Κώδικας και σχόλια&lt;/h2&gt;

&lt;p&gt;Μπορείτε να βρείτε &lt;strong&gt;τον κώδικα από αυτό το άρθρο&lt;/strong&gt; στο &lt;a href=&quot;https://github.com/iridakos/bash-completion-tutorial&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Για &lt;strong&gt;feedback, σχόλια, λάθη κ.λπ.&lt;/strong&gt; παρακαλώ ανοίξτε ένα &lt;a href=&quot;https://github.com/iridakos/bash-completion-tutorial/issues&quot;&gt;issue&lt;/a&gt; στο αποθετήριο.&lt;/p&gt;

&lt;h3 id=&quot;μεγάλο-άρθρο-φωτογραφία-γάτας&quot;&gt;Μεγάλο άρθρο, φωτογραφία γάτας&lt;/h3&gt;

&lt;p&gt;Να σας συστήσω των debugger μου.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/posts/bash-completion/cat.jpg&quot; alt=&quot;My debugger&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Αυτό ήταν. Τελειώσαμε. Καλή συνέχεια.&lt;/p&gt;
</description>
        <pubDate>Wed, 13 Nov 2019 10:30:00 +0200</pubDate>
        <link>https://iridakos.com/el/programming/2019/11/13/bash-programmable-completion-tutorial</link>
        <guid isPermaLink="true">https://iridakos.com/el/programming/2019/11/13/bash-programmable-completion-tutorial</guid>
        
        <category>bash</category>
        
        <category>linux</category>
        
        <category>programmable-completion</category>
        
        <category>opensource</category>
        
        <category>tutorial</category>
        
        <category>how-to</category>
        
        <category>featured</category>
        
        <category>δημοφιλή</category>
        
        <category>γραμμή εντολών</category>
        
        <category>ανοιχτό λογισμικό</category>
        
        <category>βοήθημα</category>
        
        
        <category>programming</category>
        
      </item>
    
  </channel>
</rss>
