Sieppaa kaikki komentosarjan lähdöt tiedostoon (itse käsikirjoituksesta) [kaksoiskappale]

Tähän kysymykseen on jo annettu vastauksia :

Kommentit

  • Niille, jotka päätyvät tänne Googlesta, saatat myös harkita tätä vastausta ( unix.stackexchange.com/a/164017/103505 ) vain asettamaan kaikki koodit haluat tulostaa komentosarjan funktiossa ja ohjata sitten kyseisen funktion lähdön.

Vastaa

Menetelmä, jonka löysin kaappaamaan minkä tahansa istunnon kaikki lähdöt, on aloittaa uusi bash-istunto ja tee lokitiedostoon. sen todella hyödyllinen seuranta enemmän kuin vain komentosarja.

 bash | tee ~/bash.log #this will save standard output until the bash session is ended bash | tee ~/bash.log 2>&1 #this will save all output including errors until the bash session is ended 

tai voit vain asettaa käsikirjoituksen itse

./myscript.sh | tee ./myscript.log #this will log only the output of the script.

Kommentit

  • Ratkaisusi osoite on STDOUT, mutta ei STDERR
  • Esitän esimerkin 2>&1
  • En ' usko, että tämä vastaa kysymykseen, koska vaatimus # <

suoritettiin ./myscript.sh ilman ylimääräisiä kuorirakenteita ".

  • Tätä kysymystä muokattiin 6 tuntia sitten, en ' ei ole kyseisiä tietoja, kun vastasin ensin kysymykseen. Se käytti > -lähtöä tee: n sijasta ja siksi jaoin vaihtoehdon tee.
  • vastaus

    Voit aina kutsua script komentosarjassa kirjaa kaikki.

    Kun haluat tulostaa ja kirjata kaiken samanaikaisesti bash-komentosarjassa osoitteeseen log.txt:

    Lokin tarkasteleminen log.txt:

    $ ./a.sh Script started, output file is log.txt teste Script done, output file is log.txt $ cat log.txt Script started on Fri Feb 16 17:57:26 2018 command: /bin/bash -c ./a.sh teste Script done on Fri Feb 16 17:57:26 2018 

    kommentit

    • Jos ymmärrän oikein (jotkut selitykset auttaisivat :), komentosarja yrittää havaita, toimiiko ' script eikä suorita itseään uudelleen. Ubuntu 20: sta lähtien näyttää siltä, että $SCRIPT ei ole asetettu, joten komentosarja menee äärettömään silmukkaan.
    • Hyvä idea käyttää script, koska se sallii esimerkiksi vuorovaikutteisen päätelaitteen Vaunun paluu töihin. Itse asiassa komennot, jotka näyttävät yhden rivin edistymislähdön (esimerkiksi arkistoijat), käyttäytyvät normaalisti . Mitä tulee loputtoman silmukan ongelman ratkaisemiseen, voimme testata kuoren tason : if (( $SHLVL < 3 )); then script...; fi.
    • Lisäksi komentosarjojen argumentit yhdistetään ja välitetään code -argumentissa kuorelle, jonka aloitti script (ei /bin/bash, että /bin/bash -argumentti ohitetaan util-linuxilla script)

    Vastaus

    Haluat käyttää teetä .

    Esimerkki:

    echo "Hello World" | tee out.txt 

    Tämä luo tiedoston out.txt komennon lähdön kanssa ja tulostaa sen näytölle. Käytä ”tee -a-tiedostonimi”, jos haluat liittää tiedostoon.

    echo "Hello" | tee -a out.txt echo "World" | tee -a out.txt 

    out.txt: ssä on kaksi riviä Hei ja Maailma (ilman -a sitä olisi vain maailmaa)

    Jos haluat tallentaa koko käsikirjoituksen ja tulostaa koko käsikirjoituksen:

    ./script.sh | tee output.txt 

    Kommentit

    • Ratkaisusi osoite on STDOUT, mutta ei STDERR.
    • unix.stackexchange.com/a/61932/268823 selittää, miten STDOUT ja STDERR tehdään
    • En ' usko, että tämä vastaa kysymykseen, koska vaatimus nro 1 oli " ajaa ./myscript.sh ilman muita kuorirakenteita ".
    • Yksi tapa tehdä se olisi laittaa kaikki funktioon ja käyttää tee lopussa. Se toimisi tehokkaasti aloituksen ja lopetuksen kaappaamisena. Ja ohjaamalla STDERR uudelleen, jos se on tarkoitusta.

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *