Pentru o comandă, dacă se utilizează -
ca argument în locul unui nume de fișier va însemna STDIN sau STDOUT.
-
Dar în acest exemplu, creează un fișier cu numele
-
:echo hello > -
Cum pot face ca
-
în acest exemplu să însemne STDOUT? -
În schimb, cum pot face ca
-
să însemne un fișier numit-
în exemple precum:cat -
Comentarii
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
-
În loc de
echo hello > -
, puteți utilizaecho 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.
-
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 |
-
Î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ă.
2>&-
, ceea ce înseamnă ” închide descriptorul 2 „.