1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980
|
Bash Prompt HOWTO
Giles Orr, giles@interlog.com
v0.60, 07 gennaio 1999
Viene discusso come creare e controllare il prompt del terminale e di
xterm, compresa l'uso delle sequenze di escape standard per ottenere
il nome utente, la directory di lavoro corrente, l'ora, ecc. Vengono
esposti ulteriori suggerimenti su come modificare le barre di titolo
di xterm, usare funzioni esterne per fornire informazioni sul prompt e
su come usare i colori ANSI.
1. Introduzione
1.1. Prerequisiti
Avrete bisogno di Bash. La versione fornita con quasi tutte le
distribuzioni Linux la 1.14.7 (al momento della stesura di questo
documento, Novembre 98), che una shell ben conosciuta e affidabile.
Bash ora disponibile nella versione 2.0+: oramai ho utilizzato Bash
2.0 per qualche tempo, ma quasi tutto il codice qui presentato
dovrebbe funzionare con la 1.14.7. Se dovessi essere a conoscenza di
un problema, ne far menzione. Potete controllare la vostra versione
di Bash digitando echo $BASH_VERSION al prompt. Sulla mia macchina,
risponde con 2.02.1(1)-release.
Sarebbe utile, ma non essenziale, esperienza nella programmazione
shell: pi ne sapete, pi sarete in grado di creare prompt complessi.
In questo tutorial presuppongo una conoscenza di base della
programmazione shell e delle utility Unix. Comunque, le mie stesse
capacit nella programmazione shell sono limitate, cos fornisco molti
esempi e spiegazioni che possono apparire superflue ad un esperto
programmatore shell.
1.2. Come Usare Questo Documento
Includo molti esempi e spiegazioni. Parti diverse saranno utili in
varia misura a persone diverse. Questo documento diventato
abbastanza lungo e leggerlo tutto in una volta sarebbe difficile -
leggete solamente le sezioni che vi servono, tornate indietro quando
necessario.
1.3. Traduzioni
Al momento in cui scrivo (6 gennaio 99), sono in lavorazione
traduzioni in giapponese (Akira Endo, akendo@t3.rim.or.jp) e tedesco
(Thomas Keil, thomas@h-preissler.de). Molte grazie ad entrambi! Gli
URL verranno inclusi quando le traduzioni saranno disponibili.
1.4. Problemi
Questa una lista di problemi che ho notato nel programmare i prompt.
Non iniziate a leggere qui, e non lasciate che questa lista vi
scoraggi - questi sono principalmente dettagli minori. Controllate qui
se vi scontrate con qualche cosa di strano.
Molte funzionalit di Bash (come i calcoli matematici all'interno
di $(()) fra gli altri) sono opzioni definite in fase di
compilazione. Se state usando una distribuzione binaria come quelle
fornite con una distribuzione standard di Linux, tutte queste
funzionalit dovrebbero essere gi definite in fase di
compilazione. Ma se state lavorando sul sistema altrui, vale la
pena ricordarsene se qualcosa non funziona come vi aspettate. Vi
sono alcune note su questo in Learning the Bash Shell, p.260-262.
Lo screen manager "screen" non funziona sempre bene con i colori
ANSI. Sfortunatamente non sono un esperto di screen. La mia attuale
versione di screen (una molto recente) sembra funzionare bene in
tutti i casi, ma ho visto occasioni in cui screen ha ridotto tutti
i colori del prompt al colore di primo piano standard negli X
terminal. Questo non sembra essere un problema nella consolle.
I file Xdefault possono reimpostare i colori. Cercate in
~/.Xdefaults linee che fanno riferimento a XTerm*background e
XTerm*foreground (o forse XTerm*Background e XTerm*Foreground).
Uno dei prompt menzionati in questo documento usa l'output di
"jobs" - come gi discusso, l'output di "jobs" verso un pipe non
funziona in Bash 2.02.
Le sequenze di escape ANSI per il movimento del cursore non sono
tutte implementate in tutti gli X terminal. Questo discusso in
una sezione a parte.
Alcune pseudo-immagini carine possono essere create usando i font
VGA piuttosto che i font standard di Linux. Sfortunatamente, questi
effetti sono pessimi se non usate font VGA, e non c' modo di
scoprire all'interno di un terminale quali font sta usando.
Bash 2.0+ disponibile e include alcune nuove funzionalit e
cambia un po' il comportamento. Cose che funzionano sulla 1.14.7
non funzionano necessariamente sulla 2.0+, o vice versa.
1.5. Inviatemi Commenti e Suggerimenti
Questa anche per me una "esperienza didattica". Sono arrivato a
saperne un bel po' su cosa pu essere fatto per creare prompt Bash
interessanti e utili, ma ho bisogno dei vostri suggerimenti per
correggere e migliorare questo documento. Ho provato a controllare i
miei suggerimenti con versioni differenti di Bash (principalmente
2.02, che uso, e 1.14.7, che molto usata), ma fatemi sapere se
trovate delle incompatibilit.
L'ultima versione di questo documento dovrebbe essere sempre
disponibile su http://www.interlog.com/~giles/bashprompt.html. Per
favore dategli un'occhiata e lasciate pure un e-mail a
giles@interlog.com con suggerimenti.
Uso gli HOWTO del Linux Documentation Project quasi esclusivamente in
formato HTML, cos quando converto questo documento da SGML, HTML
l'unico formato che controllo interamente. Se ci sono problemi con
altri formati, potrei non saperlo e gradirei una nota a riguardo.
1.6. Crediti
Nel produrre questo documento, ho preso in prestito molto dal lavoro
del progetto Bashprompt su http://bash.current.nu/. Altre fonti usate
includono l'xterm Title mini-HOWTO di Ric Lister, reperibile su
http://sunsite.unc.edu/LDP/HOWTO/mini/Xterm-Title.html, Ansi Prompts
di Keebler, reperibile su
http://www.ncal.verio.com/~keebler/ansi.html, How to make a Bash
Prompt Theme di Stephen Webb, reperibile su
http://bash.current.nu/bash/HOWTO.html e X ANSI Fonts di Stumpy,
reperibile su http://home.earthlink.net/~us5zahns/enl/ansifont.html.
Sono state anche di immenso aiuto diverse conversazioni e e-mail di
Dan, un collega del Georgia College & State University, le cui
conoscenze di UNIX superano di molto le mie. Egli mi ha dato numerosi
ed eccellenti suggerimenti, le sue idee hanno portato ad alcuni prompt
interessanti.
Tre libri che sono stati utili nel prorammare i prompt sono Linux in a
Nutshell di Jessica Heckman Perry (O'Reilly, 1997), Learning the Bash
Shell di Cameron Newham e Bill Rosenblatt (O'Reilly, 2nd. ed., 1998) e
Unix Shell Programming di Lowell Jay Arthur (Wiley, 1986. Questa la
prima edizione, la quarta uscita nel 1997).
1.7. Copyright e Liberatoria
This document is copyright 1998-1999 by Giles Orr. You are encouraged
to redistribute it. You may not modify this document (see the section
on contacting me: I have so far been incorporating all changes
recommended by readers). Please contact me if you're interested in
doing a translation: that's one modification I can live with.
This document is available for free, and, while I have done the best I
can to make it accurate and up to date, I take no responsibility for
any problems you may encounter resulting from the use of this
document.
Ovvero:
Questo documento sotto il copyright di 1998-1999 by Giles Orr. Siete
incoraggiati a ridistribuirlo. Non potete modificare questo documento
(vedete la sezione su come contattarmi: fino ad ora ho incluso tutti
cambiamenti raccomandati dai lettori). Per piacere contattatemi se
siete interessati a fare una traduzione: una modifica che posso
tollerare.
Questo documento disponibile gratuitamente e, mentre ho fatto il mio
meglio per renderlo accurato e aggiornato, non mi assumo nessuna
responsabilit per alcun problema in cui vi possiate imbattere come
risultato dell'uso di questo documento.
2. Bash e i Prompt Bash
2.1. Cosa Bash
Discendente dalla Bourne Shell, Bash un progetto GNU, la "Bourne
Again SHell". l'interfaccia a linea di comando standard su molte
macchine Linux. Eccelle in interattivit, nel supportare modifica,
completamento e richiamo della linea di comando. Supporta anche prompt
configurabili - molti lo sanno, ma non sanno quanto si pu fare.
2.2. Quali sono i vantaggi di modificare il prompt?
La maggior parte dei sistemi Linux hanno un prompt predefinito in un
colore (di solito grigio) che dice il vostro nome utente, il nome
della macchina su cui lavorate e qualche indicazione sulla directory
di lavoro corrente. Queste sono tutte informazioni utili, ma si pu
fare molto di pi con il prompt: ogni genere di informazione pu
essere visualizzata (numero di tty, ora, data, carico della macchina,
numero di utenti, uptime ...) e il prompt pu utilizzare colori ANSI,
per farlo apparire interessante, o per fare s che certe informazioni
siano evidenti. anche possibile manipolare la barra del titolo di un
Xterm per visualizzare alcune di queste informazioni.
2.3. Perch darsi tante noie?
Oltre che essere bello, spesso utile tenere traccia delle
informazioni di sistema. Una idea che so piace a molti la
possibilit di mettere su macchine differenti prompt con colori
differenti. Se avete diversi Xterm aperti su macchine differenti, o se
tendete a dimenticare su quale macchina state lavorando e a cancellare
file sbagliati, troverete questa un ottima maniera per ricordare su
che macchina vi trovate.
2.4. Il Primo Passo
L'aspetto del prompt viene controllato dalla variabile della shell
PS1. Le continuazioni di un comando sono indicate dalla stringa PS2,
che pu essere modificata con esattamente gli stessi metodi qui
discussi - poich controllarla esattamente uguale e non
altrettanto "interessante", modificher primcipalmente la stringa PS1.
(Ci sono anche le stringhe PS3 e PS4. Queste non vengono mai viste
dall'utente medio - si veda la pagina di manuale di Bash se si
interessati al loro scopo). Per modificare l'aspetto del prompt,
dovete cambiare la variabile PS1. Per fare esperimenti, potete
cambiare la stringa PS1 direttamente al prompt e vedere immediatamente
i risultati (questo influenza solo la sessione corrente e i
cambiamenti spariscono quando fate log-out). Se volete rendere
permanente un cambiamento del prompt, modificate il file ~/.bashrc e
aggiungete l la nuova definizione di PS1. Se avete permessi di root,
potete guardare in /etc/profile e modificare la linea "PS1=". Sappiate
che in alcune distribuzioni (almeno la Redhat 5.1) /etc/bashrc resetta
le stringhe PS1 e PS2.
Prima di cominciare, importante ricordare che la stringa PS1 viene
salvata nell'ambiente. Se la modificate alla linea di comando, il
prompt cambier di conseguenza. Prima di fare dei cambiamenti, potete
salvare il prompt corrente in un'altra variabile d'ambiente:
[giles@nikola giles]$ SAVE=$PS1
[giles@nikola giles]$
Il prompt pi semplice sarebbe un singolo carattere, come:
[giles@nikola giles]$ PS1=$
$ls
bin mail
$
Questo dimostra il modo migliore per fare esperimenti con semplici
prompt, digitarli alla linea di comando. Si noti che il testo digitato
dall'utente appare immediatamente dopo il prompt: io preferisco usare
$PS1="$ "
$ ls
bin mail
$
che inserisce uno spazio dopo il prompt, rendendolo pi leggibile. Per
ripristinare il prompt originale, semplicemente richiamate la
variabile che avete salvato:
$ PS1=$SAVE
[giles@nikola giles]$
2.5. Sequenza di Escape dei Prompt Bash
Vi sono molte sequenze di escape offerte dalla shell Bash da inserire
nel prompt. Dalla pagina di manuale di Bash 2.02:
Quando eseguita in modalit interattiva, bash mostra il prompt
primario quando pronta per leggere un comando e il prompt
secondario PS2 quando necessario ulteriore input per
completare il comando. Bash permette di personalizzare queste stringhe
di prompt inserendo vari caratteri di escape speciali che vengono
interpretati come segue:
\a il carattere ASCII beep (07)
\d la data nel formato "Giorno-della-settimana Mese Data"
(e.g., "Tue May 26")
\e un carattere di escape ASCII (033)
\h l'hostname fino al primo `.'
\H l'hostname
\n il carattere "newline"
\r il carattere "carriage return"
\s il nome della shell, il nome base di $0
(la parte che segue lo slash finale)
\t l'ora corrente nel formato 24-ore HH:MM:SS
\T l'ora corrente nel formato 12-ore HH:MM:SS
\@ l'ora corrente nel formato 12-ore am/pm
\u lo username dell'utente corrente
\v la versione di bash (e.g., 2.00)
\V la release di bash, versione + patchlevel
(e.g., 2.00.0)
\w la directory di lavoro corrente
\W il nome di base della directory di lavoro corrente
\! il numero cronologico (history number) di questo comando
\# il numero di questo comando
\$ se l'UID effettivo 0, un #, altrimenti un $
\nnn il carattere corrispondente al numero ottale nnn
\\ un backslash
\[ comuncia una sequenza di caratteri non stampabili, che
potrebbero essere usati per inserire una sequenza di
controllo del terminale nel prompt
\] termina la sequenza di caratteri non stampabili
Continuando da dove avevamo interrotto:
[giles@nikola giles]$ PS1="\u@\h \W> "
giles@nikola giles> ls
bin mail
giles@nikola giles>
Questo simile al prompt predefinito su molte distribuzioni Linux.
Volevo un apparenza leggermente differente, cos l'ho cambiato a:
giles@nikola giles> PS1="[\t][\u@\h:\w]\$ "
[21:52:01][giles@nikola:~]$ ls
bin mail
[21:52:15][giles@nikola:~]$
2.6. Impostare Permanentemente le Stringhe PS?
Varie persone e distribuzioni impostano le loro stringhe PS? in posti
diversi. I posti pi comuni sono /etc/profile, /etc/bashrc,
~/.bash_profile e ~/.bashrc. Johan Kullstam (johan19@idt.net) scrive:
La stringa PS1 dovrebbe essere impostata in
.bashrc. questo perch le shell bash non interattive resettano
PS1. La pagina di manuale di bash dice come la presenza o l'assenza di
PS1 un buon modo di sapere se ci si trova in una sessione
bash interattiva oppure non-interattiva (e.g. uno script).
Il modo in cui mi sono accorto di questo che startx
uno script bash. Questo significa che startx annuller il
vostro prompt. Quando impostate PS1 in .profile (o .bash_profile),
fate login alla consolle, fate partire X con startx, il vostro PS1
viene annullato nel processo lasciandovi con il prompt predefinito.
Una soluzione di lanciare xterm e rxvt con l'opzione -ls per
forzarli a leggere .profile. Ma ogni volta che viene invoca una shell
mediante uno shell-script non interativo PS1 viene perduto. system(3)
usa sh -c che se sh bash distrugger
PS1. Un modo migliore mettere la definizione di PS1 in
.bashrc . questo viene letto ogni volta bash parte ed dove le
cose interattive - come PS1 - dovrebbero restare.
Quindi dovrebbe essere sottolineato che PS1=..blabla.. dovrebbe stare
in .bashrc e non in .profile.
Ho provato a duplicare il problema che spiega, e ne ho incontrato uno
diverso: la mia variabile PROMPT_COMMAND (che verr introdotta pi
tardi) stata distrutta. Le mie conoscenze in quest'area sono un po'
vaghe, cos mi associo a quanto dice Johan.
3. Comandi Esterni
3.1. PROMPT_COMMAND
Bash fornisce un'altra variabile d'ambiente chiamata PROMPT_COMMAND.
Il contenuto di questa variabile viene eseguito come un normale
comando Bash appena prima che Bash visualizzi il prompt.
[21:55:01][giles@nikola:~] PS1="[\u@\h:\w]\$ "
[giles@nikola:~] PROMPT_COMMAND="date +%H%M"
2155
[giles@nikola:~] d
bin mail
2156
[giles@nikola:~]
Ci che accaduto sopra che ho cambiato PS1 in modo da non
includere pi la sequenza di escape \t, cos da visualizzare l'ora in
un formato che mi piace di pi. Ma l'ora compare in una linea diversa
dal prompt. Aggiustando questo con echo -n ... (come mostrato sotto)
funziona con Bash 2.0+, ma sembra non funzonare con Bash 1.14.7:
apparentemente il prompt viene ottenuto in maniera differente e il
metodo seguente causa una sovrapposizione del testo.
2156
[giles@nikola:~] PROMPT_COMMAND="echo -n [$(date +%H%M)]"
[2156][giles@nikola:~]$
[2156][giles@nikola:~]$ d
bin mail
[2157][giles@nikola:~]$ unset PROMPT_COMMAND
[giles@nikola:~]
echo -n ... controlla l'output del comando date e sopprime il
carattere newline finale, permettendo al prompt di apparire tutto su
una riga. Alla fine ho usato il comando unset per rimuovere la
variabile d'ambiente PROMPT_COMMAND.
Si noti che uso la convenzione $(<comando>) per la sostituzione dei
comandi: ovvero:
$(date +%H%M)
significa "sostituisci qui l'output del comando date +%H%M". Questo
funziona in Bash 2.0+. In qualche versione pi vecchia di Bash,
precedente alla 1.14.7, potreste dovere usare i backquote (`date
+%H%M`). I backquote possono essere usati in Bash 2.0+, ma stanno
venendo via via rimpiazzati in favore di $(), che si annida meglio.
Continuer ad utilizzare questa convenzione in questo documento. Se
state usando una versione precedente di Bash, potete di solito
sostituite dei backquote dove vedete $(). Se la sostituzione di
comandi preceduta da "\" (cio \$(comando) ), usate dei backslash
davanti ad entrambi i backquote (cio \'comando\' ).
3.2. Comandi Esterni nel Prompt
Potete anche usare l'output di normali comandi Linux direttamente nel
prompt. Ovviamente, non dovrete inserire molto materiale altrimenti
creer un prompt molto grande. Dovrete anche inserire un comando
veloce, perch verr eseguito ogni volta che il prompt appare sullo
schemo e ritardi nell'apparire del prompt mentre state lavorando
possono essere molto fastidiosi. (Differentemente dall'esempio
precedente, a cui assomiglia molto, questo funziona anche con Bash
1.14.7).
[21:58:33][giles@nikola:~]$ PS1="[\$(date +%H%M)][\u@\h:\w]\$ "
[2159][giles@nikola:~]$ ls
bin mail
[2200][giles@nikola:~]$
importante notare il backslash prima del segno dollaro della
sostituzione di comando. Senza di esso, il comando esterno viene
eseguito esattamente una volta: quando la stringa PS1 viene letta
nell'ambiente. Per questo prompt, ci significherebbe mostrare lo
stesso orario indipendentemente da quanto il prompt viene utilizzato.
Il backslash protegge il contenuto di $() dall'interpretazione
immediata della shell, cos "date" viene chiamato ogni volta che il
prompt viene generato.
Linux viene fornito con molti piccoli programmi di utilit come date,
grep, o wc che consentono di manipolare informazioni. Se vi trovate a
creare complesse combinazioni di questi programmi all'interno di un
prompt, potrebbe essere pi semplice fare voi stessi uno shell script
e chiamarlo dal prompt. Per assicurare che le variabili della shell
siano espanse al momento giusto negli shell script bash sono spesso
necessarie delle sequenze di escape (come visto sopra con il comando
date): questo viene elevato ad un altro livello all'interno della
linea del prompt PS1 ed evitare ci creando degli shell script una
buona idea.
Un esempio di un piccolo shell script usato all'interno di un prompt
viene dato a seguire:
#!/bin/bash
# lsbytesum - somma il numero di byte in un elenco di directory
TotalBytes=0
for Bytes in $(ls -l | grep "^-" | cut -c30-41)
do
let TotalBytes=$TotalBytes+$Bytes
done
TotalMeg=$(echo -e "scale=3 \n$TotalBytes/1048576 \nquit" | bc)
echo -n "$TotalMeg"
A volte l'ho usato come una funzione (molto pi efficiente -
sfortunatamente, spiegare in dettaglio le funzioni va oltre lo scopo
di questo documento), altre come uno shell script nella mia directory
~/bin, che nel mio path. Usata in un prompt:
[2158][giles@nikola:~]$ PS1="[\u@\h:\w (\$(lsbytesum) Mb)]\$ "
[giles@nikola:~ (0 Mb)]$ cd /bin
[giles@nikola:/bin (4.498 Mb)]$
3.3. Cosa Mettere nel Prompt
Avrete notato che io metto il nome della macchina, l'ora e la
directory corrente nella maggioranza dei miei prompt. Ad eccezione
dell'ora queste sono cose molto standard da mettere nel prompt, l'ora
l'aggiunta pi comune dopo queste. Ma cosa includere nel prompt
interamente una questione di gusto personale. Questi sono esempi da
persone che conosco per aiutare a darvi delle idee.
Il prompt di Dan minimale ma efficace, particolarmente per via del
modo in cui funziona.
[giles@nikola:~]$ cur_tty=$(tty | sed -e "s/.*tty\(.*\)/\1/")
[giles@nikola:~]$ echo $cur_tty
p4
[giles@nikola:~]$ PS1="\!,$cur_tty,\$?\$ "
1095,p4,0$
A Dan non piace avere la directory corrente che pu ridimensionare
drasticamente il prompt come ci si muove nell'albero delle directory,
cos ne tiene traccia a mente (o digita "pwd"). Lui ha imparato Unix
con csh e tcsh, cos usa molto la command history (qualcosa che molti
di noi, viziati da bash, non facciamo), cos la prima cosa nel prompt
l'history number. La seconda cosa sono i caratteri significativi del
tty (l'output di "tty" viene tagliato con sed), una cosa che pu
essere utile per gli utilizzatori di "screen". La terza cosa il
valore di uscita dell'ultimo comando/pipeline (si noti che questo
viene reso inutile da ogni comando eseguito all'interno del prompt -
potreste per ottenerlo salvando il valore in una variabile e
rimettendolo poi a posto). In fine, lo "\$" un carattere dollaro per
un normale utente e cambia in un cancelletto ("#") se l'utente root.
Torben Fjerdingstad ha scritto per dirmi che spesso sospende dei job e
poi se ne dimentica, cos usa il prompt per ricordarsi dei job
sospesi:
[giles@nikola:~]$ function jobcount {
> jobs|wc -l| awk '{print $1}'
> }
[giles@nikola:~]$ export PS1='\W[`jobcount`]# '
giles[0]# man ls &
[1] 4150
[1]+ Stopped (tty output) man ls
giles[1]#
Torben usa awk per togliere gli spazi vuoti dall'output di wc, mentre
io avrei usato sed oppure tr - non perch siano meglio, ma perch mi
sono pi familiari. Vi sono probabilmente anche altri modi. Torben
delimita la stringa PS1 con apostrofi (single quote), questo evita che
Bash interpreti immediatamente i backquote, cos lui non deve farli
precedere da "\" come ho menzionato.
NOTA: C' un noto bug in Bash 2.02 che fa s che il comando jobs
(integrato nella shell) non restituisca nulla ad un pipe. Se provate
quanto sopra con Bash 2.02, otterrete sempre "0" indipendentemente da
quanti job avete sospesi. Chet Ramey, uno dei manutentori di Bash, mi
dice che questo sar corretto in v2.03.
3.4. Ambiente e Funzioni Bash
Come menzionato prima, PS1, PS2, PS3, PS4 e PROMPT_COMMAND sono tutti
salvati nell'ambiente Bash. Per quelli di noi che hanno precedente
esperienza con DOS, l'idea di maneggiare grosse porzioni di codice
nell'ambiente terrificante, perch l'ambiente DOS era piccolo e
proprio non cresceva bene. Vi sono probabilmente limiti pratici su
cosa pu e cosa dovrebbe essere messo nell'ambiente, ma non so quali
siano; stiamo probabilmente parlando di un paio di ordini di grandezza
in pi di quanto gli utenti DOS siano abituati. Come dice Dan:
"Nella mia shell interattiva ho 62 alias e 25 funzioni. La mia regola
generale che se ho bisogno di qualcosa solamente per uso interattivo
e pu essere scritta in bash ne faccio una funzione (presumendo che
non possa essere espressa facilmente con un alias). Se queste persone
hanno problemi di memoria non dovrebbero usare bash. Bash uno dei
programmi pi grossi che faccio girare nella mia Linux box (a parte
Oracle). Lancia top qualche volta e premi 'M' per ordinare per memoria
occupata - vedrai quanto bash vicino alla cima della lista. Caspita,
pi grosso di sendmail! D loro di prendere qualcosa come ash".
Credo che quel giorno stesse usando solo la consolle: girando X e le
applicazioni X, ho molte cose pi grosse di Bash. Ma l'idea la
stessa: l'ambiente qualcosa da utilizzare senza preoccuparsi di
riempirlo troppo.
Rischio la censura da parte dei guru di Unix quando dico questo (per
crimine di ipersemplificazione): le funzioni sono in pratica piccoli
shell script che vengono caricati nell'ambiente per motivi di
efficienza. Citando ancora Dan: "Le funzioni shell sono efficienti
quanto pi possibile. Approssimativamente l'equivalente di eseguire
uno shell script bash/bourne eccetto che nessun I/O di file
necessario perch la funzione gi in memoria. Le funzioni shell sono
tipicamente caricate da .bashrc o .bash_profile a seconda che le si
voglia solo nella shell iniziale o anche nelle sottoshell. Se
confronti questo con l'esecuzione di uno shell script: la shell fa un
fork, il processo figlio apre il file e fa un exec, potenzialmente il
path viene esaminato, il kernel apre il file e esamina sufficienti
byte da determinare come eseguire il file, nel caso di uno shell
script una shell deve essere avviata con il nome dello script come
argomento, la shell allora apre il file, legge e esegue i comandi.
Diversamente, con una funzione shell, tutto fuorch l'esecuzione dei
comandi pu essere considerato overhead non necessario".
4. Manipolazioni della Barra del Titolo di Xterm
Posso essere usate dele sequenze di escape non stampabili per produrre
effetti interessanti nei prompt. Per usare queste sequenze di escape,
dovete includerle fra \[ e \], dicendo a Bash di ignorare questo
materiale nel calcolare la dimensione del prompt. Se non si includono
questi delimitatori si fa in modo che il cursore appaia nel posto
sbagliato perch la sua effettiva dimensione sconosciuta. Le
sequenze di escape devono anche essere precedute da \033[ prima della
versione 2 di Bash oppure da \033[ o \e[ in versioni successive.
Se cercate di cambiare la barra del titolo dell'Xterm con il prompt
quando siete alla consolle, produrrete spazzatura. Per evitare questo,
testate la variabile d'ambiente XTERM per sapere se il prompt si
trover in un Xterm.
function proml
{
case $TERM in
xterm*)
local TITLEBAR='\[\033]0;\u@\h:\w\007\]'
;;
*)
local TITLEBAR=''
;;
esac
PS1="${TITLEBAR}\
[\$(date +%H%M)]\
[\u@\h:\w]\
\$ "
PS2='> '
PS4='+ '
}
Questa una funzione che pu essere incorporata in ~/.bashrc. Il nome
della funzione potrebbe quindi essere chiamato per eseguire la
funzione. La funzione, come la stringa PS1, viene salvata
nell'ambiente. Una volta che la stringa PS1 viene impostata dalla
funzione, potete rimuovere la funzione dall'ambiente con unset proml.
Dal momento che il prompt non pu cambiare da quando sta in un Xterm a
quando sta alla consolle, la variabile TERM non viene testata ogni
volta che il prompt viene generato. Ho usato i marcatori di
continuazione (i backslash) nella definizione del prompt, per
consentire di scriverlo su pi righe. Questo migliora la leggibilit
rendendo pi facile modificarlo e fare un debug.
Lo definisco come una funzione perch cos come il pacchetto
Bashprompt (discusso pi avanti in questo documento) tratta i prompt:
non la sola maniera di farlo, ma funziona bene. Via via che i prompt
che utilizzate diventano pi complessi, diventa sempre pi
sconveniente digitarli al prompt e pi pratico metterli in qualche
sorta di file di testo. In questo caso, per testare questo prompt,
salvate quendo sopra come un file di testo chiamato "proml". potete
lavorare come segue:
[giles@nikola:/bin (4.498 Mb)]$ cd -> Andate dove volete salvare il prompt
[giles@nikola:~ (0 Mb)]$ vi proml -> Modificate il file del prompt
... -> Inserite il testo dato sopra
[giles@nikola:~ (0 Mb)]$ source proml -> Leggete la funzione del prompt
[giles@nikola:~ (0 Mb)]$ proml -> Eseguite la funzione del prompt
Il primo passo nel creare questo prompt di controllare se la shell
che stiamo facendo partire in un xterm o no: se lo , la variabile
della shell (${TITLEBAR}) viene definita. Essa consiste delle sequenze
di escape appropriate e \u@\h:\w, che mettono
<utente>@<macchina>:<directory di lavoro> nella barra del titolo di
Xterm. Questo particolarmente utile con Xterm minimizzati,
rendendoli identificabili pi rapidamente. Il resto del materiale in
questo prompt dovrebbe essere gi noto dai precedenti prompt che
abbiamo creato.
Il solo inconveniente di manipolare la barra dell'Xterm in questo modo
avviene quando vi loggate in un sistema su cui non avete predisposto
il trucchetto della barra del titolo: l'Xterm continuer a mostrare
l'informazione del precedente sistema su cui c'era il trucco.
5. Sequenze di escape ANSI: Colori e Movimenti del Cursore
5.1. Colori
Come menzionato prima, i caratteri di escape non stampabili devono
essere racchiusi da \[\033[ e \]. Per le sequenze di escape, devono
anche essere seguiti da m minuscola.
Se provate i prompt seguenti in un xterm e trovate che non vedete i
colori menzionati, controllate nel file ~/.Xdefaults (e possibilmente
gli altri con simile funzione) le linee come "XTerm*Foreground:
BlanchedAlmond". Questo pu essere commentato mettendo un punto
esclamativo ("!") davanti. Ovviamente questo dipender anche da che
emulatore di terminale state usando. Questo il posto pi probabile
in cui i colori del vostro terminale possono essere reimpostati.
Per includere del testo blu nel prompt:
PS1="\[\033[34m\][\$(date +%H%M)][\u@\h:\w]$ "
Il problema con questo prompt che il colore blu che inizia con il
codice-colore 34 non viene mai cambiato nuovamente al normale colore,
cos il testo digitato dopo il prompt ancora nel colore del promot.
Questa una tonalit di blu scura, unendola con il codice bold
(grassetto) potrebbe aiutare:
PS1="\[\033[1;34m\][\$(date +%H%M)][\u@\h:\w]$\[\033[0m\] "
Il prompt ora blu chiaro e termina cambiando il colore nuovamente a
nulla (quale che fosse il colore di primo piano che avevate prima)
Questo sono i restanti valori dei colori:
Nero 0;30 Grigio Scuro 1;30
Blu 0;34 Blu Chiaro 1;34
Verde 0;32 Verde Chiaro 1;32
Ciano 0;36 Ciano Chiaro 1;36
Rosso 0;31 Rosso Chiaro 1;31
Viola 0;35 Viola Chiaro 1;35
Marrone 0;33 Giallo 1;33
Grigio Chiaro 0;37 Bianco 1;37
Potete anche impostare i colori dello sfondo usando 44 per uno sfondo
blu, 41 per uno sfondo rosso, ecc. Non ci sono colori dello sfondo in
grassetto (bold). Possono essere usate delle combinazioni, come testo
Rosso Chiaro su uno sfondo Blu: \[\033[44;1;31m\], sebbene impostare i
colori separatamente sembra funzionare meglio (cio
\[\033[44m\]\[\033[1;31m\]). Gli altri codici disponibili includono 4:
Sottolineatura, 5: Lmpeggiante, 7: Negativo, e 8: Nascosto.
In oltre: Molti (incluso me stesso) si oppongono fermamente
all'attributo "blink". Fortunatamente, non funziona in ogni emulatore
di terminale che conosco - ma funziona alla consolle. E, se vi state
chiedento (come ho fatto io) "A cosa serve un attributo 'Nascosto'?!"
- l'ho visto usato in un esempio di uno shell script (non un prompt)
per permettere di digitare una password senza visualizzarla sullo
schermo.
Basato su un prompt chiamato "elite2" nel pacchetto Bashprompt (che ho
modificato per funzionare meglio su una consolle standard, piuttosto
che con i font speciali di xterm richiesti per vedere bene
l'originale), questo un prompt che ho usato molto:
function elite
{
local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
case $TERM in
xterm*)
local TITLEBAR='\[\033]0;\u@\h:\w\007\]'
;;
*)
local TITLEBAR=""
;;
esac
local GRAD1=$(tty|cut -d/ -f3)
PS1="$TITLEBAR\
$GRAY-$CYAN-$LIGHT_CYAN(\
$CYAN\u$GRAY@$CYAN\h\
$LIGHT_CYAN)$CYAN-$LIGHT_CYAN(\
$CYAN\#$GRAY/$CYAN$GRAD1\
$LIGHT_CYAN)$CYAN-$LIGHT_CYAN(\
$CYAN\$(date +%H%M)$GRAY/$CYAN\$(date +%d-%b-%y)\
$LIGHT_CYAN)$CYAN-$GRAY-\
$LIGHT_GRAY\n\
$GRAY-$CYAN-$LIGHT_CYAN(\
$CYAN\$$GRAY:$CYAN\w\
$LIGHT_CYAN)$CYAN-$GRAY-$LIGHT_GRAY "
PS2="$LIGHT_CYAN-$CYAN-$GRAY-$LIGHT_GRAY "
}
Io definisco i colori come variabili temporanee della shell per
leggibilit. pi facile lavorarci. La variablie "GRAD1" un
controllo per determinare in che terminale ci si trova, come il
controllo per determinare se ci si trova su un Xterm, sufficiente
farlo una sola volta. Il prompt che vedrete ha questo aspetto, ma a
colori:
--(giles@nikola)-(75/ttyp7)-(1908/12-Oct-98)--
--($:~/tmp)--
Per aiutarmi a ricordare quali colori sono disponibili, ho scritto lo
script seguente che visualizza tutti i colori sullo schermo:
______________________________________________________________________
#!/bin/bash
#
# Questo file stampa molti codici-colore sul terminale per
# mostrare quali sono disponibili. Ogni linea e` un colore su sfondo
# nero o grigio, con il colore nel mezzo. E` verificato che funziona con
# sfondo bianco, nero e verde (2 dic 98).
#
echo " On Light Gray: On Black:"
echo -e "\033[47m\033[1;37m White \033[0m\
1;37m \
\033[40m\033[1;37m White \033[0m"
echo -e "\033[47m\033[37m Light Gray \033[0m\
37m \
\033[40m\033[37m Light Gray \033[0m"
echo -e "\033[47m\033[1;30m Gray \033[0m\
1;30m \
\033[40m\033[1;30m Gray \033[0m"
echo -e "\033[47m\033[30m Black \033[0m\
30m \
\033[40m\033[30m Black \033[0m"
echo -e "\033[47m\033[31m Red \033[0m\
31m \
\033[40m\033[31m Red \033[0m"
echo -e "\033[47m\033[1;31m Light Red \033[0m\
1;31m \
\033[40m\033[1;31m Light Red \033[0m"
echo -e "\033[47m\033[32m Green \033[0m\
32m \
\033[40m\033[32m Green \033[0m"
echo -e "\033[47m\033[1;32m Light Green \033[0m\
1;32m \
\033[40m\033[1;32m Light Green \033[0m"
echo -e "\033[47m\033[33m Brown \033[0m\
33m \
\033[40m\033[33m Brown \033[0m"
echo -e "\033[47m\033[1;33m Yellow \033[0m\
1;33m \
\033[40m\033[1;33m Yellow \033[0m"
echo -e "\033[47m\033[34m Blue \033[0m\
34m \
\033[40m\033[34m Blue \033[0m"
echo -e "\033[47m\033[1;34m Light Blue \033[0m\
1;34m \
\033[40m\033[1;34m Light Blue \033[0m"
echo -e "\033[47m\033[35m Purple \033[0m\
35m \
\033[40m\033[35m Purple \033[0m"
echo -e "\033[47m\033[1;35m Pink \033[0m\
1;35m \
\033[40m\033[1;35m Pink \033[0m"
echo -e "\033[47m\033[36m Cyan \033[0m\
36m \
\033[40m\033[36m Cyan \033[0m"
echo -e "\033[47m\033[1;36m Light Cyan \033[0m\
1;36m \
\033[40m\033[1;36m Light Cyan \033[0m"
______________________________________________________________________
5.2. Movimenti del Cursore
Le sequenze di escape ANSI permettono di muovere il cursore a piacere
sullo schermo. Questo pi utile per interfacce utente a tutto
schermo generate da shell script, ma possono essere usate anche nei
prompt. Le sequenze di escape di movimento sono le seguenti:
- Posizione del cursore:
\033[<L>;<C>H
mette il cursore alla linea L e colonna C.
- Muove il cursore su N linee:
\033[<N>A
- Muove il cursore gi N linee:
\033[<N>B
- Muove il cursore avanti N colonne:
\033[<N>C
- Muove il cursore indietro N colonne:
\033[<N>D
- Salva la posizione del cursore:
\033[s
- Ripristina la posizione del cursore:
\033[u
Gli ultimi due codici NON SONO supportati da molti emulatori di
terminale. Gli unici che so che lo fanno sono xterm e nxterm - anche
se la maggior parte degli emulatori di terminale sono basati sul
codice di xterm. Da quanto ho potuto vedere rxvt, kvt, xiterm, e Eterm
non li supportano. Sono supportati alla consolle.
Provate a digitare le seguenti linee di codice al prompt (cosa fa un
po' pi chiaro se il prompt alcune linee gi nel terminale quando lo
digitate): echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D". Questo
dovrebbe muovere il cursore sette linee su per lo schermo, stampare la
parola " BASH ", e poi tornare dov'era per produrre un normale prompt.
Questo non un prompt: solo una dimostrazione di come muovere il
cursore sullo schermo, usando il colore per evidenziare quanto viene
fatto.
Salvate questo in un file chiamato "clock":
______________________________________________________________________
#!/bin/bash
function prompt_command {
let prompt_x=$COLUMNS-5
}
PROMPT_COMMAND=prompt_command
function clock {
local BLUE="\[\033[0;34m\]"
local RED="\[\033[0;31m\]"
local LIGHT_RED="\[\033[1;31m\]"
local WHITE="\[\033[1;37m\]"
local NO_COLOUR="\[\033[0m\]"
case $TERM in
xterm*)
TITLEBAR='\[\033]0;\u@\h:\w\007\]'
;;
*)
TITLEBAR=""
;;
esac
PS1="${TITLEBAR}\
\[\033[s\033[1;\$(echo -n \${prompt_x})H\]\
$BLUE[$LIGHT_RED\$(date +%H%M)$BLUE]\[\033[u\033[1A\]
$BLUE[$LIGHT_RED\u@\h:\w$BLUE]\
$WHITE\$$NO_COLOUR "
PS2='> '
PS4='+ '
}
______________________________________________________________________
Questo prompt piuttosto semplice, ma tiene un orologio nell'angolo
in alto a destra del terminale (anche se il terminale viene
ridimensionato). Questo NON funzioner negli emulatori di terminale
che, come ho menzionato, non accettano i codici per salvare e
ripristiare la posizione del cursore. Se provate ad usare questo
prompt in uno di quegli emulatori di terminale, l'orologio apparir
correttamente, ma il prompt verr intrappolato nella seconda linea del
terminale.
Vedi anche ``Il Prompt Orologio Inutile ed Elegante'' per un uso pi
esteso di questi codici.
5.3. Muovere il Cursore Con tput
Come molte cose in Unix, c' pi di un modo per raggiungere gli stessi
fini. Una utility chiamata "tput" pu essere usata anche per spostare
il cursore sullo schermo, o per ottenere informazioni sullo stato di
un terminale. "tput", per posizionare il cursore, meno flessibile
delle sequenze di escape ANSI: si pu muovere il cursore solo ad una
posizione assoluta, non si pu relativamente alla sua posizione
corrente. Non uso "tput", quindi non intendo spiegarlo in dettaglio.
Digitate "man tput" e ne saprete quanto me.
6. Caratteri Speciali: Sequenze di Escape Ottali
Oltre i caratteri che si digitano sulla tastiera, ci sono molti altri
caratteri che possono essere stampati sullo schermo. Ho creato uno
script per permettervi di controllare cosa mette a disposizione il
font che state usando. Il comando principale che avrete bisogno di
usare per utilizzare questi caratteri "echo -e". L'opzione "-e"
dice ad echo di abilitare l'interpretazione dei caratteri protetti con
backslash. Cosa si vede quando guardate 200-400 ottale molto diverso
con un font VGA da quello che si vede con un font Linux standard.
Siate avvisati che queste sequenze di escape hanno effetti strani sul
terminale, e non ho tentato di prevenire che facciano quello che
fanno. I caratteri linedraw e block (ai quali molti di noi sono
diventati familiari con Word Perfect) e che sono usati molto dal
progetto Bashprompt, sono fra 260 e 337 ottale.
______________________________________________________________________
#!/bin/bash
# Script: escgen
function usage {
echo -e "\033[1;34mescgen\033[0m <lower_octal_value> [<higher_octal_value>]"
echo " Octal escape sequence generator: print all octal escape sequences"
echo " between the lower value and the upper value. If a second value"
echo " isn't supplied, print eight characters."
echo " 1998 - Giles Orr, no warranty."
exit 1
}
if [ "$#" -eq "0" ]
then
echo -e "\033[1;31mPlease supply one or two values.\033[0m"
usage
fi
let lower_val=${1}
if [ "$#" -eq "1" ]
then
# If they don't supply a closing value, give them eight characters.
upper_val=$(echo -e "obase=8 \n ibase=8 \n $lower_val+10 \n quit" | bc)
else
let upper_val=${2}
fi
if [ "$#" -gt "2" ]
then
echo -e "\033[1;31mPlease supply two values.\033[0m"
echo
usage
fi
if [ "${lower_val}" -gt "${upper_val}" ]
then
echo -e "\033[1;31m${lower_val} is larger than ${upper_val}."
echo
usage
fi
if [ "${upper_val}" -gt "777" ]
then
echo -e "\033[1;31mValues cannot exceed 777.\033[0m"
echo
usage
fi
let i=$lower_val
let line_count=1
let limit=$upper_val
while [ "$i" -lt "$limit" ]
do
octal_escape="\\$i"
echo -en "$i:'$octal_escape' "
if [ "$line_count" -gt "7" ]
then
echo
# Put a hard return in.
let line_count=0
fi
let i=$(echo -e "obase=8 \n ibase=8 \n $i+1 \n quit" | bc)
let line_count=$line_count+1
done
echo
______________________________________________________________________
Potete anche usare xfd per mostrare tutti i caratteri un un font X,
con il comando "xfd -fn <fontname>". Facendo clic su un carattere
vengono date molte informazioni circa quel catattere, incluso il suo
valore ottale. Lo script dato sopra sar utile alla consolle e se non
siete sicuri del nome del font corrente.
7. Il Pacchetto Bash Prompt
7.1. Disponibilit
Il pacchetto Bash Prompt disponibile qui http://bash.current.nu, ed
il lavoro di molte persone, coordinate da Rob Current (aka
BadLandZ). Il pacchetto in versione beta, ma offre una maniera
semplice di usare prompt multipli (o temi), permette di impostare il
prompt per shell di login e per sottoshell (cio mettere stringhe PS1
in (~/.bash_profile e ~/.bashrc). La maggior parte dei temi usano i
set di caratteri estesi VGA, quindi hanno un brutto aspetto a meno che
siano usati con font VGA (che non sono presenti su molti sistemi).
7.2. Cambiare il Font di Xterm
Per usare alcuni dei prompt pi attraenti nel pacchetto Bash Prompt,
dovete prendere e installare installare i font che supportano il set
di caratteri richiesto dai prompt. Ci si riferise ad essi come "Font
VGA", ma non mi chiara la distinzione fra essi e i font gi
distribuiti presenti con Linux - sebbene chiaramente supportano set di
caratteri differenti. I font per Xterm standard supportano un alfabeto
esteso, inclusi molti caratteri accentati. Nei font VGA, questo
materiale viene rimpiazzato da caratteri grafici - blocchi, punti,
linee. Se qualcuno pu spiegare questo pi in dettaglio mi mandi un e-
mail e includer qui una spiegazione.
Ottenere e installare questi font un processo un po' contorto.
Prima, recuperate i/il font. Poi, assicuratevi che siano file .pcf o
.pcf.gz. Se sono file .bdf, informatevi sul comando "bdftopcf" (cio
leggete la man page). Mettete i file .pcf o .pcf.gz nella directory
/usr/X11R6/lib/X11/fonts/misc (questa la directory corretta per
RedHat 5.1 e Slackware 3.4, potrebbe essere differente su altre
distribuzioni). Fate "cd" su quella directory ed eseguite il comando
"mkfontdir". Quindi eseguite "xset fp rehash". A volte una buona
idea andare nel file fonts.alias nella stessa directory e creare dei
nomi alternativi pi corti per i font.
Per usare i nuovi font, lanciate l'Xterm che pi vi piace con
l'opzione appropriata, che pu essere trovata nella man page o usando
il parametro "--help" alla linea di comando. Alcuni Xterm comuni
dovrebbero essere usati come segue:
xterm -font <fontname>
OPPURE
xterm -fn <fontname> -fb <fontname-bold>
Eterm -f <fontname>
rxvt -fn <fontname>
I font VGA sono disponibili alla Stumpy's ANSI Fonts su
http://home.earthlink.net/~us5zahns/enl/ansifont.html (da cui ho preso
in prestito molto nello scrivere questo documento).
8. Caricare un Prompt Differente
8.1. Caricare un Prompt Differente, Pi Tardi
Le spiegazione in questo HOWTO hanno mostrato come creare variabili di
ambiente PS1, oppure come incorporare quelle stringhe PS1 e PS2 in
funzioni che potrebbero essere create da ~/.bashrc o come un tema dal
pacchetto bashprompt.
Usando il pachetto bashprompt, si deve digitare bashprompt -i per
vedere una lista dei prompt disponibili. Per impostare il prompt in
shell di login future (principalmente la consolle, ma anche telnet e
Xterm, dipende da come sono configurati i vostri Xterm), si deve
digitare bashprompt -l nometema. bashprompt quindi modifica il vostro
~/.bash_profile per chiamare il tema richiesto alla partenza. Per
impostare il prompt in future sottoshell (solitamente Xterm, rxvt,
ecc.), si deve digitare bashprompt -s nometema, e bashprompt modifica
il vostro file ~/.bashrc per chiamare il tema richiesto alla partenza.
8.2. Caricare un Prompt Differente, Immediatamente
Potete cambiare il prompt nel terminale corrente (usando la funzione
esempio "elite" di cui sopra) digitando source elite seguito da elite
(assumendo che il file funzione elite sia nella directory corrente).
Questo un po' poco pratico e vi lascia con un'altra funzione (elite)
nel vostro spazio ambiente - se volete ripulire l'ambiente, dovreste
digitare anche unset elite. Questo sembrerebbe un candidato ideale per
un piccolo shell script, ma uno script in questo caso non funziona
perch lo script non pu modificare l'ambiente della shell corrente:
pu solo cambiare l'abiente della sottoshell in cui gira. Come lo
script termina, la sottoshell sparisce e cos i cambiamente fatti
all'ambiente. Cosa pu cambiare le variabili d'ambiente della shell
corrente sono le funzioni d'ambiente. Il pacchetto bashprompt mette
una funzione chiamato "callbashprompt" nell'ambiente e, sebbene non
sia documentata, pu essere chiamata per caricare al volo qualsiasi
tema bashprompt. Guarda nella directory dei temi che ha installato (il
tema che chiamate deve essere l), interpreta la funzione richiesta,
carica la funzione e poi elimina la funzione, mantenendo wuindi
l'ambiente in ordine. "callbashprompt" non pensata per essere usata
cos e non controlla eventuali errori, ma tenendo questo a mente,
funziona piuttosto bene.
9. Caricare il Colori del Prompt Dinamicamente
9.1. Un esempio che dimostra il concetto
Questa una dimostrazione del concetto piuttosto che un prompt
attraente: cambiare i colori all'interno di un prompt dinamicamente.
In questo esempio, il colore dell'hostname cambia in funzione del
carico (come un avvertimento).
#!/bin/bash
# "hostloadcolour" - 17 ottobre 98, Giles
#
# Qui l'idea e` di cambiare il colore dell'hostname nel prompt, a
# seconda del valore del carico.
# THRESHOLD_LOAD e` il valore del carico per un minuto (moltiplicato
# per cento) al quale volete che il prompt cambi da COLOUR_LOW a
# COLOUR_HIGH
THRESHOLD_LOAD=200
COLOUR_LOW='1;34'
# blu chiaro
COLOUR_HIGH='1;31'
# rosso chiaro
function prompt_command {
ONE=$(uptime | sed -e "s/.*load average: \(.*\...\), \(.*\...\), \(.*\...\)/\1/" -e "s/ //g")
# A quanto pare, "scale" in bc non funziona con la moltiplicazione,
# ma funziona con la divisionone.
ONEHUNDRED=$(echo -e "scale=0 \n $ONE/0.01 \nquit \n" | bc)
if [ $ONEHUNDRED -gt $THRESHOLD_LOAD ]
then
HOST_COLOUR=$COLOUR_HIGH
# rosso chiaro
else
HOST_COLOUR=$COLOUR_LOW
# blu chiaro
fi
}
function hostloadcolour {
PROMPT_COMMAND=prompt_command
PS1="[$(date +%H%M)][\u@\[\033[\$(echo -n \$HOST_COLOUR)m\]\h\[\033[0;37m\]:\w]$ "
}
Usando il vostro editor preferito, salvate queso in un file chiamato
"hostloadcolour". Se avete il pacchetto Bashprompt installato, Questo
funzioner come un tema. Se no, digitate source hostloadcolour e poi
hostloadcolour. In entrambi i modi, "prompt_command" diventa una
funzione nel vostro ambiente. Se esaminate il codice, noterete che i
colori ($COLOUR_HIGH e $COLOUR_LOW) sono impostati usanto solo un
codice del colore parziale, cio "1;34" invece di "\[\033[1;34m\]",
che avrei preferito. Non sono stato in grado di farlo funzionare con
il codice completo. Siete pregati di farmi sapere se doveste
riuscirvi.
10. Prompt di Esempio
10.1. Un Prompt "Leggero"
function proml {
local BLUE="\[\033[0;34m\]"
local RED="\[\033[0;31m\]"
local LIGHT_RED="\[\033[1;31m\]"
local WHITE="\[\033[1;37m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
case $TERM in
xterm*)
TITLEBAR='\[\033]0;\u@\h:\w\007\]'
;;
*)
TITLEBAR=""
;;
esac
PS1="${TITLEBAR}\
$BLUE[$RED\$(date +%H%M)$BLUE]\
$BLUE[$LIGHT_RED\u@\h:\w$BLUE]\
$WHITE\$$LIGHT_GRAY "
PS2='> '
PS4='+ '
}
10.2. Elite dai Temi Bashprompt
Si noti che questo necessita di un font VGA.
# Creato da KrON da windowmaker su IRC
# Cambiato da Spidey 08/06
function elite {
PS1="\[\033[31m\]\332\304\[\033[34m\](\[\033[31m\]\u\[\033[34m\]@\[\033[31m\]\h\
\[\033[34m\])\[\033[31m\]-\[\033[34m\](\[\033[31m\]\$(date +%I:%M%P)\
\[\033[34m\]-:-\[\033[31m\]\$(date +%m)\[\033[34m\033[31m\]/\$(date +%d)\
\[\033[34m\])\[\033[31m\]\304-\[\033[34m]\\371\[\033[31m\]-\371\371\
\[\033[34m\]\372\n\[\033[31m\]\300\304\[\033[34m\](\[\033[31m\]\W\[\033[34m\])\
\[\033[31m\]\304\371\[\033[34m\]\372\[\033[00m\]"
PS2="> "
}
10.3. Un Prompt per il "Power User"
Io in realt uso questo prompt, ma si ottengono notevoli ritardi
quando il prompt appare su una macchina monoutente PII-400, quindi non
raccomando di usarlo su un P-100 multiutente o altro... Guardatelo per
cercare idee, piuttosto che per usarlo in pratica.
______________________________________________________________________
#!/bin/bash
#----------------------------------------------------------------------
# POWER USER PROMPT "pprom2"
#----------------------------------------------------------------------
#
# Creato nell'agosto 98, Ultima Modifica 9 novembre 98 da Giles
#
# Problema: quando load va giu', dice "1.35down-.08", eliminare il
# segno negativo
function prompt_command
{
# Crea la variabile TotalMeg: somma delle dimensioni dei file
# visibile nella directory corrente
local TotalBytes=0
for Bytes in $(ls -l | grep "^-" | cut -c30-41)
do
let TotalBytes=$TotalBytes+$Bytes
done
TotalMeg=$(echo -e "scale=3 \nx=$TotalBytes/1048576\n if (x<1) {print \"0\"} \n print x \nquit" | bc)
# Questo viene usato per calcolare il differenziale del valore
# del carico fornito dal comando "uptime". "uptime" fornisce medie di
# carico per 1, 5 r 15 minuti.
#
local one=$(uptime | sed -e "s/.*load average: \(.*\...\), \(.*\...\), \(.*\...\)/\1/" -e "s/ //g")
local five=$(uptime | sed -e "s/.*load average: \(.*\...\), \(.*\...\), \(.*\...\).*/\2/" -e "s/ //g")
local diff1_5=$(echo -e "scale = scale ($one) \nx=$one - $five\n if (x>0) {print \"up\"} else {print \"down\"}\n print x \nquit \n" | bc)
loaddiff="$(echo -n "${one}${diff1_5}")"
# Conta file visibili:
let files=$(ls -l | grep "^-" | wc -l | tr -d " ")
let hiddenfiles=$(ls -l -d .* | grep "^-" | wc -l | tr -d " ")
let executables=$(ls -l | grep ^-..x | wc -l | tr -d " ")
let directories=$(ls -l | grep "^d" | wc -l | tr -d " ")
let hiddendirectories=$(ls -l -d .* | grep "^d" | wc -l | tr -d " ")-2
let linktemp=$(ls -l | grep "^l" | wc -l | tr -d " ")
if [ "$linktemp" -eq "0" ]
then
links=""
else
links=" ${linktemp}l"
fi
unset linktemp
let devicetemp=$(ls -l | grep "^[bc]" | wc -l | tr -d " ")
if [ "$devicetemp" -eq "0" ]
then
devices=""
else
devices=" ${devicetemp}bc"
fi
unset devicetemp
}
PROMPT_COMMAND=prompt_command
function pprom2 {
local BLUE="\[\033[0;34m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local LIGHT_GREEN="\[\033[1;32m\]"
local LIGHT_BLUE="\[\033[1;34m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local YELLOW="\[\033[1;33m\]"
local WHITE="\[\033[1;37m\]"
local RED="\[\033[0;31m\]"
local NO_COLOUR="\[\033[0m\]"
case $TERM in
xterm*)
TITLEBAR='\[\033]0;\u@\h:\w\007\]'
;;
*)
TITLEBAR=""
;;
esac
PS1="$TITLEBAR\
$BLUE[$RED\$(date +%H%M)$BLUE]\
$BLUE[$RED\u@\h$BLUE]\
$BLUE[\
$LIGHT_GRAY\${files}.\${hiddenfiles}-\
$LIGHT_GREEN\${executables}x \
$LIGHT_GRAY(\${TotalMeg}Mb) \
$LIGHT_BLUE\${directories}.\
\${hiddendirectories}d\
$LIGHT_CYAN\${links}\
$YELLOW\${devices}\
$BLUE]\
$BLUE[${WHITE}\${loaddiff}$BLUE]\
$BLUE[\
$WHITE\$(ps ax | wc -l | sed -e \"s: ::g\")proc\
$BLUE]\
\n\
$BLUE[$RED\$PWD$BLUE]\
$WHITE\$\
\
$NO_COLOUR "
PS2='> '
PS4='+ '
}
______________________________________________________________________
10.4. Un Prompt Largo Quanto il Terminale
Un amico si lamentato perch non gli piaceva che il prompt cambiasse
continuamente di dimensione perch c'era $PWD all'interno, cos ho
scritto questo prompt che adatta la sua dimensione all'esatta
larghezza dal terminale.
______________________________________________________________________
#!/bin/bash
# termwide prompt
# Giles - creato il 2 novembre 98
#
# Qui l'idea e` di avere la linea superiore di questo prompt di due
# linee sempre della larghezza del terminale. Questo viene fatto
# calcolando la larghezza degli elementi di testo e riempendo come
# appropriato o troncando a destra $PWD.
#
function prompt_command {
TERMWIDTH=${COLUMNS}
# Calcola la larghezza del prompt:
hostnam=$(echo -n $HOSTNAME | sed -e "s/[\.].*//")
# "whoami" e "pwd" includono un carattere "carriage return" finale
usernam=$(whoami)
let usersize=$(echo -n $usernam | wc -c | tr -d " ")
newPWD="${PWD}"
let pwdsize=$(echo -n ${newPWD} | wc -c | tr -d " ")
# Aggiunge tutti gli accessori sotto ...
let promptsize=$(echo -n "--(${usernam}@${hostnam})---(${PWD})--" \
| wc -c | tr -d " ")
let fillsize=${TERMWIDTH}-${promptsize}
fill=""
while [ "$fillsize" -gt "0" ]
do
fill="${fill}-"
let fillsize=${fillsize}-1
done
if [ "$fillsize" -lt "0" ]
then
let cut=3-${fillsize}
sedvar=""
while [ "$cut" -gt "0" ]
do
sedvar="${sedvar}."
let cut=${cut}-1
done
newPWD="...$(echo -n $PWD | sed -e "s/\(^${sedvar}\)\(.*\)/\2/")"
fi
}
PROMPT_COMMAND=prompt_command
function termwide {
local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local WHITE="\[\033[1;37m\]"
local NO_COLOUR="\[\033[0m\]"
local LIGHT_BLUE="\[\033[1;34m\]"
local YELLOW="\[\033[1;33m\]"
case $TERM in
xterm*)
TITLEBAR='\[\033]0;\u@\h:\w\007\]'
;;
*)
TITLEBAR=""
;;
esac
PS1="$TITLEBAR\
$YELLOW-$LIGHT_BLUE-(\
$YELLOW\${usernam}$LIGHT_BLUE@$YELLOW\${hostnam}\
${LIGHT_BLUE})-${YELLOW}-\${fill}${LIGHT_BLUE}-(\
$YELLOW\${newPWD}\
$LIGHT_BLUE)-$YELLOW-\
\n\
$YELLOW-$LIGHT_BLUE-(\
$YELLOW\$(date +%H%M)$LIGHT_BLUE:$YELLOW\$(date \"+%a,%d %b %y\")\
$LIGHT_BLUE:$WHITE\$$LIGHT_BLUE)-\
$YELLOW-\
$NO_COLOUR "
PS2="$LIGHT_BLUE-$YELLOW-$YELLOW-$NO_COLOUR "
}
______________________________________________________________________
10.5. Il Prompt Orologio Inutile ed Elegante
Questo probabilmente il pi attraente (e inutile) prompt che abbia
mai creato. Poich gli emulatori di terminale non implementano il
salvataggio e ripristino della posizione del cursore, l'alternativa
per mettere un orologio nell'angolo in alto a destra e di ancorare il
prompt nella parte inferiore del terminale. Questo deriva dall'idea
del prompt ampio quanto il terminale di cui sopra, disegnando una
linea nella parte destra dello schermo dal prompt all'orologio.
richiesto un font VGA.
Nota: qui c' una sostituzione strana, che potrebbe non venir stampata
correttamente quando viene convertita da SGML ad altri formati: ho
dovuto sostituire il carattere screen con \304 - normalmente avrei
introdotto solo la sequenza "\304", ma in questo caso era necessario
per fare questa sostituzione.
______________________________________________________________________
#!/bin/bash
# Questo prompt richiede i font VGA. Il prompt e` ancorato in basso
# al terminale, riempie la larghezza del terminale e disegna una linea
# sul lato destro del terminale per collegarsi all'orologio
# nell'angolo in alto a destra del terminale.
function prompt_command {
# Calcola la larghezza del prompt:
hostnam=$(echo -n $HOSTNAME | sed -e "s/[\.].*//")
# "whoami" e "pwd" includono il carattere "carriage return" finale
usernam=$(whoami)
newPWD="${PWD}"
# Aggiunge tutti gli accessori sotto ...
let promptsize=$(echo -n "--(${usernam}@${hostnam})---(${PWD})-----" \
| wc -c | tr -d " ")
# Trova quanto aggiungere fra user@host e PWD (o quanto rimuovere
# da PWD)
let fillsize=${COLUMNS}-${promptsize}
fill=""
# Riempie la linea se il prompt non e` largo quanto il terminale:
while [ "$fillsize" -gt "0" ]
do
fill="${fill}"
# La A con la dieresi (apparira` come una lunga linea se state
# usando un font VGA) e` \304, ma l'ho "tagliata" e poi "incollata"
# perche' Bash farebbe solo una sostituzione - che in questo caso e`
# mettere $fill nel prompt.
let fillsize=${fillsize}-1
done
# Tronca a destra PWD se il prompt e` piu` largo del terminale:
if [ "$fillsize" -lt "0" ]
then
let cutt=3-${fillsize}
sedvar=""
while [ "$cutt" -gt "0" ]
do
sedvar="${sedvar}."
let cutt=${cutt}-1
done
newPWD="...$(echo -n $PWD | sed -e "s/\(^${sedvar}\)\(.*\)/\2/")"
fi
#
# Crea l'orologio e la barra lungo il lato destro del terminale
#
local LIGHT_BLUE="\033[1;34m"
local YELLOW="\033[1;33m"
# Posiziona il cursore per stampare l'orologio:
echo -en "\033[2;$((${COLUMNS}-9))H"
echo -en "$LIGHT_BLUE($YELLOW$(date +%H%M)$LIGHT_BLUE)\304$YELLOW\304\304\277"
local i=${LINES}
echo -en "\033[2;${COLUMNS}H"
# Stampa linee verticali lungo il lato del terminale:
while [ $i -ge 4 ]
do
echo -en "\033[$(($i-1));${COLUMNS}H\263"
let i=$i-1
done
let prompt_line=${LINES}-1
# Questo e` necessario perche' facendo \${LINES} all'interno di una
# espressione matematica Bash (come $(())) sembra non funzionare.
}
PROMPT_COMMAND=prompt_command
function clock3 {
local LIGHT_BLUE="\[\033[1;34m\]"
local YELLOW="\[\033[1;33m\]"
local WHITE="\[\033[1;37m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local NO_COLOUR="\[\033[0m\]"
case $TERM in
xterm*)
TITLEBAR='\[\033]0;\u@\h:\w\007\]'
;;
*)
TITLEBAR=""
;;
esac
PS1="$TITLEBAR\
\[\033[\${prompt_line};0H\]
$YELLOW\332$LIGHT_BLUE\304(\
$YELLOW\${usernam}$LIGHT_BLUE@$YELLOW\${hostnam}\
${LIGHT_BLUE})\304${YELLOW}\304\${fill}${LIGHT_BLUE}\304(\
$YELLOW\${newPWD}\
$LIGHT_BLUE)\304$YELLOW\304\304\304\331\
\n\
$YELLOW\300$LIGHT_BLUE\304(\
$YELLOW\$(date \"+%a,%d %b %y\")\
$LIGHT_BLUE:$WHITE\$$LIGHT_BLUE)\304\
$YELLOW\304\
$LIGHT_GRAY "
PS2="$LIGHT_BLUE\304$YELLOW\304$YELLOW\304$NO_COLOUR "
}
______________________________________________________________________
|