Utilizarea liniuței (-) în locul unui nume de fișier

Pentru o comandă, dacă se utilizează - ca argument în locul unui nume de fișier va însemna STDIN sau STDOUT.

  1. Dar în acest exemplu, creează un fișier cu numele -:

    echo hello > - 

    Cum pot face ca - în acest exemplu să însemne STDOUT?

  2. În schimb, cum pot face ca - să însemne un fișier numit - în exemple precum:

    cat - 

Comentarii

  • Din moment ce aparent trebuie să am 50 de reputație pentru a comenta direct .. În comentariul / dev / stdin / dev / stdout, AIX, care este un derivat legitim UNIX nu are aceste pseudodispozitive. Și, ca un comentariu suplimentar, LINUX nu este un derivat UNIX în niciun caz. Este un lucru compatibil POSIX și cel mai popular dintre OS UNIX-ish ‘ în acest moment, dar nu faceți nicio greșeală, nu este UNIX. Dar, esența răspunsurilor aici este corectă. Notarea ” – ” nu este interpretată ca specială de către shell și este astfel transmisă direct fiecărei aplicații individuale ca ARG. Dacă aplicația nu recunoaște
  • Există, de asemenea, o construcție 2>&-, ceea ce înseamnă ” închide descriptorul 2 „.
  • @ user95873, ceea ce presupun că ai vrut să spui este: în timp ce Linux este de tip Unix, nu orice tip de Unix (sau UNIX adevărat) este Linux . Problema dacă Linux este sau nu este ‘ t adevărat UNIX (adică respectă specificația unică UNIX) ‘ nu are legătură cu / dev / std {in, out, err} issue. Ca / dev / std {in, out, err} este funcția adăugată , nu lipsește .

Răspuns

Utilizarea - ca nume de fișier pentru a însemna stdin / stdout este o convenție pe care o folosesc o mulțime de programe. Nu este o proprietate specială a numelui fișierului. Nucleul nu recunoaște - ca fiind special, astfel încât orice apel de sistem care se referă la - ca nume de fișier va utiliza - literal ca nume de fișier.

Cu redirecționare bash, - nu este recunoscut ca nume de fișier special, așa că bash îl va folosi ca nume de fișier literal.

Când cat vede șirul - ca un nume de fișier, îl tratează ca un sinonim pentru stdin. Pentru a evita acest lucru, trebuie să modificați șirul pe care cat îl vede în așa fel încât să se refere în continuare la un fișier numit -. Modul obișnuit de a face acest lucru este să prefixați numele fișierului cu o cale – ./- sau /home/Tim/-. Această tehnică este, de asemenea, utilizată pentru a rezolva probleme similare în care opțiunile liniei de comandă se ciocnesc cu numele fișierelor, astfel încât un fișier denumit ./-e nu apare ca -e opțiunea de linie de comandă pentru un program, de exemplu.

Comentarii

  • Este ‘ s merită adăugat că /dev/stdin și /dev/stdout sunt disponibile universal și pot fi utilizate în locul - convenție.
  • @jmtd: / dev / std {in, out} nu sunt disponibile universal. Nu toate unixurile îl au.
  • Interesant, am presupus că fac parte din POSIX (dar nu pot ‘ să confirme). Ei ‘ sunt prezenți cel puțin pe Linux, BSD-uri și Solaris. Puteți da un exemplu de UNIX modern care îi lipsește?
  • @camh Nu sunt sigur dacă ați primit notificarea și acesta este un subiect foarte, foarte vechi; Nu ‘ nu sunt sigur dacă poți, dar ‘ sunt foarte curios dacă știi răspunsul la jmtd ‘ întrebare? 🙂
  • @jmtd Se pare că am găsit un răspuns provizoriu la întrebarea: unix.stackexchange.com/a/278368/31669

Răspuns

  1. În loc de echo hello > -, puteți utiliza echo hello > /dev/stdout.

    În timp ce „-” este o convenție care trebuie implementată de fiecare program care dorește să o susțină, /dev/stdin, /dev/stdout și /dev/stderr sunt, atunci când sunt acceptate de SO (cel puțin Solaris, Linux și BSD) , independent de aplicație și apoi va funcționa așa cum intenționați.

Răspuns

Ca camh menționat , - este doar o convenție de denumire utilizată de unele programe.Dacă doriți să faceți referire la aceste fluxuri cu un descriptor de fișiere pe care shell-ul îl va recunoaște, jiliagre a fost corect când ați folosit numele /dev/stdin sau /dev/stdout în schimb. Numele de fișiere respective ar trebui să funcționeze în orice loc ar funcționa un nume de fișier normal.

  1. Acestea fiind spuse, primul dvs. exemplu este cam prost. Orice ieșire care ar fi prinsă de operatorul de redirecționare pentru a scrie într-un fișier este deja ACTIVATă la ieșire standard, deci redirecționarea acestuia și redactarea acestuia de unde a venit este inutilă. Comportamentul pe care îl utilizați acolo este canalul, nu o redirecționare:

    echo hello | 
  2. În al doilea exemplu, trebuie pur și simplu să dați ceva indicație că doriți un fișier literar cu acel nume, nu aliasul intern pe care îl are. Puteți face acest lucru cel mai ușor specificând o cale către fișierul astfel:

    cat ./- 

Răspuns

În ceea ce privește 1, programul trebuie să îl susțină. Nu îl puteți folosi în mod arbitrar. În ceea ce privește 2, redirecționați intrarea de la (de ex., cat < -).

Răspuns

Abordarea „-” are multe probleme. În primul rând necesită o interpretare a caracterului „-” și multe programe nu realizează o astfel de interpretare. Și, în plus, există unele programe care interpretează o cratimă ca un delimitator care marchează sfârșitul opțiunilor din linia de comandă. Programele sunt scrise pentru a funcționa cu argumente pentru numele fișierului, abordarea „-” este un hack, frumos, dar slab.

Cel mai bun mod este:

$ echo hello > /dev/fd/1 

/dev/stdout este o legătură simbolică a /dev/fd/1

Comentarii

  • Redirecționarea este interpretată de shell, nu programul fiind invocat.

Răspuns

Caracterele speciale au în principal două semnificații:

diagramă numerică ASCII.

Script sau simbolic.

Este posibil ca un singur caracter să reprezinte un șir sau să acționeze ca un șir. După cum înțeleg.

în limbajul C fopen() funcția acceptă două argumente primul flux de fișiere și al doilea mod în care fișierul va fi deschis. modul este un șir. chiar dacă este un singur caracter.

cat > ” – ” funcționează.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *