moduri simple de a face mai convenabil utilitar de linie de comandă

Principiile de bază de a scrie o serie de aplicații consolă convenabil.

linie de comandă calitativă - un mediu de mare pentru a lucra în. Istoric, avtokomplit, benzi transportoare, expediere, o gamă largă de software gata făcute, capacitatea de a copia și insera chiar și cele mai sofisticate comanda - toate acestea fac ca CLI un instrument puternic și convenabil. Nu este surprinzător faptul că dezvoltatorii sunt dispuși să scrie propriile scripturi și programe de consola de asamblare: automatizare și deploya, baze de date de testare de implementare, statistici, monitorizare, căutare viclean - motiv să nu ia în considerare.

Cu toate acestea, „utilitarul linie de comandă“ nu înseamnă în mod automat „ușor de utilizat de utilitate.“ numele Nefericit, incomplete sau descriere, un număr mare de parametri de poziție, confuz switch-uri de denumire - linia de comandă poate fi umplut cognitive de rezistență 1 pohlesche interfață grafică foarte complicate.

Acest articol conține câteva sfaturi simple de urmat, care va ajuta la a face scripturi consola mai ușor de utilizat.

Disclaimer: sfaturi sunt destul de simple, iar dacă acestea par să vă pentru a acordat - excelent. Din păcate, chiar și astfel de lucruri simple, uneori uitate. În continuare, vă sugerez că tu și utilizatorii trăiesc într-un mediu unix cum ar fi: o coajă completă și un set complet de programe standard. În plus, folosesc cuvântul „program“, „script“ și „utilitate“ ca sinonime interschimbabile. În cele din urmă, deoarece exemplele prezentate în fragmentele de articol la Perl, dar toate sfaturile se aplică în mod egal script-uri și programe în orice limbaj de programare, iar tehnicile sunt ușor de tradus în orice limbă.

Și am scrie un script nou, la toate costurile?

Cel mai bun scenariu - una care nu trebuie să scrie. Poate că problema este rezolvată printr-o simplă combinație de programe existente? a face utilitate. sortare. găsi. grep. lsof. netstat. strace, etc. nu numai bun în sine, dar, de asemenea, perfect lipite între ele prin conducte ( „țeavă“).

Sau poate problema este rezolvata scurt perl-garnituri, care este mai ușor să scrii decât să-și amintească din nou 2. Numele script-ul terminat? Apropo, perl-garnituri este perfect integrat în producție.

nume bun

Ce este - un nume bun pentru un program bun? Scurt sau lung? Rezumatul sau descrie comportamentul? Un cuvânt sau compozit?

Iată câteva reguli simple:

mai puțin frecvent utilizat de program, cu atât mai mult poate fi numele, și vice-versa; compara ls utilizate în mod obișnuit și mult mai rar apt-get install;

Problema mai îngustă este rezolvată printr-un script, numele mai detaliată și precisă ar trebui să fie; compara make-generalizatoare și evazive ps2pdf cu totul specifice;

nume poate fi abstractă și lipsit de sens, dar în orice caz, nu ar trebui să inducă în eroare; script-ul pentru pregătirea eliberării poate fi numit și de a face cu eliberare. și RC1. dar nu-l numesc un test-ramura principală. lansarea sau nouă versiune.

parametrii numiți

În cazul în care parametrii de script sunt mai complicate decât o simplă listă de fișiere (cum ar fi rm) sau o pereche de „ceea ce-unde“ (ca în cp), «ce-unde“ (ca în grep) - script nevoie de parametrii liniei de comandă cu numele.

steaguri sunt disponibile în mod automat negație (--cache. --no-cache),

sinonime (și -q --quiet. -h și --help),

Opțiunea cu valorile obligatorii (tip de valoare poate fi specificat: string, număr, real, hexazecimal)

Valorile umolchalnyh pentru opțiuni

umplerea automata a matrice si rosturi,

Lipirea opțiuni scurte (cum ar fi perl -lane. Ls -la).

În general, documentația privind getopt :: lung și practică în aplicarea sa - merită.

Sau-o singură literă opțiune multiletter?

Mi se pare că aproape fiecare opțiune în valoare de având și o literă, și opțiuni de multiletter (cum ar fi -q și --quiet). Taste One-litere sunt convenabile pentru munca interactivă, deoarece acestea recruta și multiletter rapid - în Makefiles, și alte script-uri, ca mai bine înțeleasă la citirea.

numele parametrilor tradiționale

Vrei utilizatorii să vă amintiți rapid utilitar setări - apel acțiuni obișnuite nume cunoscute:

-V. --version - versiunea de afișare a programului,

-q. --quiet. --silent - mod cu mai puțin verbose,

-v. --verbose - Modul cu mai verbose (exemplu interesant este găsit în ssh -v vv -vvv oferi mai multe și mai detaliate de logare ...)

-n. --dry-run - o cursă de probă fără a efectua acțiuni de scris

sau N - numărul de elemente care urmează să fie prelucrate,

-o. --output - fișier pentru înregistrarea rezultatelor,

-f. --file - fișier de date pentru prelucrare,

-r. --reverse - tratament în ordine inversă,

-j. --jobs. --parallel - cât de multe procese paralele de procesare.

Cum să explice utilizatorul că este greșit

În cazul în care parametrii trecut la script-ul nu a trecut de validare și de analiză, este necesar să se informeze în mod corespunzător utilizatorului:

Este important ca mesajul de eroare a fost scurtă și în mod clar afirmă că nu este atât cu parametrii. Este inacceptabil, ca răspuns la parametrii incorecte pentru a deduce ajutorul complet - nu ajută clientul să înțeleagă ce se întâmplă.

Să vedem cum se comportă programe populare:

Aici, totul este scurt și la obiect:

mesaj de eroare scurt,

indiciu: în cazul în care pentru a viziona certificatul completă

ipoteză: că, de fapt, ar putea fi însemnat.

Când trebuie să mori

În cazul în care script-ul pentru anumite motive interne nu poate continua - este timpul pentru a apela matrița (= afișa un mesaj și de ieșire cu un cod de non-zero).

Sfat: un mesaj de eroare pentru a finaliza lipsit de ambiguitate „oprește-te.“ face pentru un utilizator aparent că programul sa oprit din cauza unei erori detectate.

dreptul de a muri

Script-ul trebuie să returneze un cod de întoarcere echitabil: în cazul în care cu succes - 0, în caz de eșec - altceva. Codul de acces corect poate fi utilizat cu succes în script-ul Makefiles pentru SVN-bisect, etc.

Notă: în grep „și un mod special atunci când nu are nimic nu se imprimă nimic. semnaleaza doar codul de ieșire: găsit sau nu a fost găsit.

Apropo, Perl'ovy mor automat oferă un cod de ieșire non-zero.

Ajutor (-h)

Prin -h (--help de dorit și, de asemenea) script-ul ar trebui să scoată certificatul în sine.

Verificați dacă este descris în referința:

toate opțiunile și parametrii, diviziunea c în obligatorii / opționale și a acceptat implicit a;

exemple tipice și complicate de utilizare: utilizatorul le poate copia și imediat a lua un exemplu al programului de lucru.

Uneori, încercând să ajute producția în stderr. Acest lucru este greșit. De referință ar trebui să scadă la stdout. care a fost ușor de manevrat grep „om, mai puțin“ om, etc.

Puteți plăti în continuare atenție la variabila de mediu $ PAGER. și dacă este setat - certificat de transfer prin conducta de acest program. De exemplu, face ca git ajutor .

Un alt aspect este faptul că retragerea ajuta la finalizarea unei non-zero cod de ieșire (ieșire 2;). Acest lucru este greșit. În cazul în care utilizatorul solicită un certificat, atunci concluzia sa - pentru a finaliza cu succes sarcina, și script-ul trebuie să raporteze care sa încheiat cu succes (exit 0;).

implicite rezonabile

Valorile implicite bune sunt critice pentru funcționarea eficientă a programului. Alegeți implicit trebuie să se bazeze pe ceea ce este obiectivul principal al programului și modul în care va fi folosit mai des.

Cu cât este mai des nevoie de nici o opțiune, cu atât mai ușor ar trebui să fie inclus, iar valoarea cea mai frecventă a parametrului ar trebui să fie asumată în mod implicit. Ideal: programul îndeplinește sarcina cea mai frecvent necesară fără nici un parametru (de exemplu: cal debuild gzip ls face plackup passwd ......).

Din nou, un bun exemplu dă grep. Caută în stdin este implicit; Căutați în lista de fișiere este activat printr-o simpla enumerare a acestora; căutare recursiv, dimensiunea context și insensibilitatea caz a inclus opțiuni cu o singură literă; tip exotic de tampon de control - opțiuni multiletter.

Interesant aranjate în GNU grep de control de culoare de colorat de ieșire: implicit pentru ieșire la concluzia terminalul interactiv este pictat, cu un fișier - nu pictat, iar pentru controlul colorat mână are opțiunea de multiletter --color.

Avtokomplit

În cazul în care script-ul are mai mulți parametri posibili (in special multiletter), scrie și să emită utilizatorilor să funcționeze complet automată (completare automată), în populara Shell. Documentație: la zsh. utilizat de bash.

Apropo, notați funcția gnu_generic în zsh. --help Dacă script-ul vorbește despre opțiunile sale într-un format destul de convențional, pentru a permite completarea automată în parametrii va fi suficient pentru a face

compdef _gnu_generic my-script.pl

Un mic truc: ieșire colorat

În cazul în care script-ul dvs. pentru a fi utilizat de către oameni on-line - simplifica percepția de ieșire, care au pictat în culori diferite. A se vedea. De exemplu, Term :: ANSIColor.

Un mic truc-2: cerere parola Silent

În cazul în care script-ul este necesar pentru a cere utilizatorului pentru o parolă sau alte informații sensibile, dezactivați afișarea caracterelor de intrare. De exemplu, la utilizarea termenului :: ReadKey:

Acestea sunt, în experiența mea, cele mai simple moduri de a îmbunătăți experiența de utilizare a programelor de consolă.

Despre rezistență cognitivă poate fi citit în cartea Alana Kupera „spital de boli mentale în mâinile pacienților,“ șeful „comportament care nu este asociat cu forțele fizice“ ↩

Abordarea „de a scrie o singură linie și uită“ se numește ad-hoc;) ↩