Vraag Hoe stderr naar een bestand om te leiden [dupliceren]


Deze vraag heeft hier al een antwoord:

Tijdens het gebruik van nohup om een ​​opdracht in de achtergrond uit te voeren, verschijnt een deel van de inhoud in de terminal.

cp: error reading ‘/mnt/tt/file.txt’: Input/output error
cp: failed to extend ‘/mnt/tt/file.txt’: Input/output error

Ik wil die inhoud opslaan in een bestand.


161
2018-05-18 12:31


oorsprong




antwoorden:


Er zijn twee hoofduitvoerstromen in Linux (en andere besturingssystemen), standaarduitvoer (stdout) en standaardfout (stderr). Foutmeldingen, zoals degene die u laat zien, worden afgedrukt op standaardfout. De klassieke omleidingsexploitant (command > file) leidt alleen standaarduitvoer om, dus de standaardfout wordt nog steeds weergegeven op de terminal. Om stderr ook om te leiden, hebt u een paar keuzes:

  1. Stuur stdout om naar één bestand en stderr naar een ander bestand:

    command > out 2>error
    
  2. Stuur stder naar stdout (&1) en stuur dan de stdout om naar een bestand:

    command >out 2>&1
    
  3. Beide naar een bestand omleiden:

    command &> out
    

Zie voor meer informatie over de verschillende besturings- en omleidingsoperators hier.


262
2018-05-18 12:50



Zo hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2> error_hashdeep.txt & of hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2>&1 of hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ &> result_mixed.txt - André M. Faria
@ AndréM.Faria ja. Maar de laatste twee opdrachten zijn gelijkwaardig, ze sturen zowel de fout als de uitvoer naar hetzelfde bestand. - terdon♦
Net zoals in de link die je hebt opgegeven, zou ik | | kunnen gebruiken in plaats van 2> en 1 ze zijn gelijk, bedankt voor je tijd. - André M. Faria
Hallo, ik heb dit kunnen vereenvoudigen om: command 2> out. - Surya Teja Karra
@SuryaTejaKarra die stderr alleen doorstuurt, maar niet stdout. - terdon♦


Het eerste ding om op te merken is dat er een paar manieren zijn, afhankelijk van je doel en shell, daarom vereist dit een klein begrip van meerdere aspecten. Het meest typisch is via 2> in Bourne-achtige schelpen, zoals dash (waar symlink naar staat /bin/sh) en bash; eerste is de standaard en POSIX-compatibele shell en de andere is wat de meeste gebruikers gebruiken voor een interactieve sessie. Ze verschillen in syntaxis en functies, maar gelukkig werkt foutomleiding redirectie hetzelfde (behalve de &> niet standaard). In het geval van csh en zijn derivaten, de stderr omleiding werkt daar niet helemaal.

Laten we terug gaan naar 2> een deel. Twee belangrijke dingen om op te merken: > betekent omleiding operator, waar we een bestand openen en 2 integer staat voor stderr file descriptor; in feite is dit precies hoe de POSIX-standaard voor shell-taal redirection definieert in sectie 2.7:

[n]redir-op word

Voor eenvoudig > omleiding, de 1 integer wordt geïmpliceerd voor stdout, i.e. echo Hello World > /dev/null is net hetzelfde als echo Hello World 1>/dev/null. Merk op dat de integer of redirection operator niet kan worden geciteerd, anders herkent shell ze niet als zodanig, en behandelt ze in plaats daarvan als een letterlijke reeks tekst. Wat de afstand betreft, is het belangrijk dat het gehele getal gelijk naast de omleidingsoperator staat, maar het bestand kan zich naast de omleidingsoperator bevinden of niet, d.w.z. command 2>/dev/null en command 2> /dev/null zal prima werken.

De enigszins vereenvoudigde syntaxis voor typisch commando in shell zou zijn

 command [arg1] [arg2]  2> /dev/null

De truc hier is dat omleiding overal kan verschijnen. Dat is het allebei 2> command [arg1] en command 2> [arg1] zijn toegestaan. Merk op dat voor bash schelp, daar bestaat het &> manier om zowel stdout- als stderr-streams op hetzelfde moment om te leiden, maar nogmaals - het is bash-specifiek en als je naar portabiliteit van scripts streeft, werkt het misschien niet. Zie ook Ubuntu Wiki en Wat is het verschil tussen &> en 2> & 1.

Notitie: De > omleiding operator afknottingeneen bestand en overschrijft het, als het bestand bestaat. De 2>> kan worden gebruikt voor toevoegen stderr bestand.

Als je het misschien opmerkt, > is bedoeld voor één opdracht. Voor scripts kunnen we de stderr-stroom van het hele script van buiten naar binnen omleiden myscript.sh 2> /dev/null of we kunnen gebruik maken van exec ingebouwd. De ingebouwde exec heeft de mogelijkheid om de stream voor de hele shell-sessie opnieuw te bedraden, om zo te zeggen, interactief of via script. Zoiets als

#!/bin/sh
exec 2> ./my_log_file.txt
stat /etc/non_existing_file

In dit voorbeeld moet het logbestand worden weergegeven stat: cannot stat '/etc/non_existing_file': No such file or directory.

Nog een andere manier is via functies. Als kopciuszek opgemerkt in zijn antwoord, kunnen we een functie-instructie schrijven met al bijgevoegde omleiding, dat wil zeggen

some_function(){
    command1
    command2
} 2> my_log_file.txt

4
2018-05-03 07:48