Bruk av dash (-) i stedet for et filnavn

For en kommando, hvis du bruker - som argument i stedet for et filnavn vil bety STDIN eller STDOUT.

  1. Men i dette eksemplet oppretter den en fil med navnet -:

    echo hello > - 

    Hvordan kan jeg gjøre at - i dette eksemplet betyr STDOUT?

  2. Omvendt, hvordan kan jeg få - til å bety en fil som heter - i eksempler som:

    cat - 

Kommentarer

  • Siden jeg tilsynelatende må ha 50 rykte for å kommentere direkte .. På / dev / stdin / dev / stdout-kommentaren har AIX, som er et legitimt UNIX-derivat, ikke disse pseudoenhetene. Og, som en ytterligere kommentar, er LINUX uansett ikke et UNIX-derivat. Det er en POSIX-kompatibel workalike, og den mest populære av UNIX-ish OS ' s på dette punktet, men gjør ingen feil, dette er ingen UNIX. Men kjernen i svarene her er riktig. " – " -notasjonen tolkes ikke som spesiell av skallet, og overføres dermed direkte til hver enkelt applikasjon som en ARG. Hvis søknaden ikke gjenkjennes
  • Det er også 2>&- konstruksjon, som betyr " lukk deskriptor 2 ".
  • @ user95873, det jeg antar at du ville si er: mens Linux er Unix-aktig, ikke alle Unix-lignende (eller ekte UNIX) er Linux . Saken om Linux er eller ikke ' t sant UNIX (dvs. oppfyller den enkle UNIX-spesifikasjonen) har ikke ' t forhold til / dev / std {inn, ut, err} utgave. Som / dev / std {in, out, err} er lagt til funksjon, ikke mangler .

Svar

Å bruke - som filnavn for å bety stdin / stdout er en konvensjon som mange programmer bruker. Det er ikke en spesiell egenskap for filnavnet. Kjernen kjenner ikke igjen - som spesiell, så alle systemanrop som refererer til - som filnavn vil bruke - bokstavelig talt som filnavnet.

Med bash-omdirigering blir - ikke gjenkjent som et spesielt filnavn, så bash vil bruke det som det bokstavelige filnavnet.

Når cat ser strengen - som et filnavn, behandles den som et synonym for stdin. For å komme deg rundt dette, må du endre strengen som cat ser på en slik måte at den fremdeles refererer til en fil som heter -. Den vanlige måten å gjøre dette på er å foran filnavnet med en bane – ./-, eller /home/Tim/-. Denne teknikken brukes også for å komme rundt lignende problemer der kommandolinjealternativer kolliderer med filnavn, så en fil referert til som ./-e vises ikke som -e for eksempel kommandolinjealternativ til et program.

Kommentarer

  • Det ' s verdt å legge til at /dev/stdin og /dev/stdout er allment tilgjengelige og kan brukes i stedet for - konvensjon.
  • @jmtd: / dev / std {in, out} er ikke allment tilgjengelig. Ikke alle unixer har det.
  • Interessant, jeg antok at de var en del av POSIX (men kan ' t bekrefte). De ' er tilstede i det minste på Linux, BSD og Solaris. Kan du gi et eksempel på en moderne UNIX som mangler dem?
  • @camh Ikke sikker på om du fikk varselet, og dette er et veldig, veldig gammelt emne; Jeg ' er ikke sikker på om du kan, men jeg ' er veldig nysgjerrig på om du vet svaret på jmtd ' spørsmål? 🙂
  • @jmtd Jeg ser ut til å ha funnet et foreløpig svar på spørsmålet: unix.stackexchange.com/a/278368/31669

Svar

  1. I stedet for echo hello > -, kan du bruke echo hello > /dev/stdout.

    Mens «-» er en konvensjon som må implementeres av hvert program som ønsker å støtte det, /dev/stdin, /dev/stdout og /dev/stderr er, når de støttes av operativsystemet (i det minste gjør Solaris, Linux og BSDs) , uavhengig av applikasjonen, og vil da fungere som du har tenkt.

Svar

Som camh nevnt , - er bare en navnekonvensjon som brukes av noen programmer.Hvis du vil referere til disse strømningene med en filbeskrivelse, vil skallet gjenkjenne, jiliagre var riktig fordi du brukte navnet /dev/stdin eller /dev/stdout i stedet. Disse filnavnene skal fungere hvor som helst et vanlig filnavn ville fungere.

  1. Når det er sagt, er ditt første eksempel litt dumt. Enhver utgang som vil bli fanget av omdirigeringsoperatøren for å skrive til en fil, er allerede PÅ standardutdata, så omdirigering og skriving tilbake til hvor den kom fra er ubrukelig. Oppførselen du bruker der er røret, ikke en viderekobling:

    echo hello | 
  2. I det andre eksemplet ditt trenger du bare å gi kan noen indikasjon på at du vil ha en søppelfil med det navnet, ikke det interne aliaset det har. Du kan gjøre dette enklest ved å spesifisere en bane til filen slik:

    cat ./- 

Svar

Når det gjelder 1, må programmet støtte det. Du kan ikke bare bruke den vilkårlig. Når det gjelder 2, viderekoble input fra (f.eks. cat < -).

Svar

«-» tilnærmingen har mange problemer. Først og fremst krever det en tolkning av «-» karakteren, og mange programmer utfører ikke slik tolkning. Og videre er det noen programmer som tolker en bindestrek som en avgrensning som markerer slutten på kommandolinjealternativene. Programmene er skrevet for å fungere med filnavnargumenter, «-» tilnærmingen er en hack, fin, men svak.

Den beste måten er:

$ echo hello > /dev/fd/1 

/dev/stdout er en symbolkobling av /dev/fd/1

Kommentarer

  • Omadresseringen tolkes av skallet, ikke programmet som påkalles.

Svar

Spesialtegn har stort sett to betydninger:

ASCII numerisk diagram.

Skrift eller symbolsk.

Det er mulig at et enkelt tegn representerer en streng, eller fungerer som en streng. Etter min forståelse.

på C-språk fopen() -funksjonen tar to argumenter, den første filstrømmen og den andre modusen der filen vil være åpen. modusen er en streng. selv om den er ett tegn.

cat > " – " fungerer.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *