Wpis z mikrobloga

Mirki, pytanko mam odnośnie przekierowania standardowego wyjścia i wyjścia błędów.

Poprzez cron uruchamiał skrypt (nie mam teraz do tego dostępu, więc klepię z pamieci):
0 * * * * /home/test/skrypt.sh >> log.txt 2>&1

W skrypcie tym pobieram sobie z neta archiwum tar, rozpakowuje go, i jeszcze kilka rzeczy. Na koniec uruchamiam sobie jakąś aplikację.
Aplikacja o przeuroczej nazwie dupa1 wyrzuca komunikaty na standardowe wyjście, czyli do pliku log.txt.

Problem polega na tym, że zarówno skrypt.sh jak i aplikacja dupa1 wrzuca wszystko do pliku log.txt.
Chciałbym aby do log.txt ładowane było standardowe wyjście oraz wyjście błędów ze skrypt.sh, natomiast w przypadku dupa1 wszystko leciało do /dev/null.

Dupa1 uruchamialem z przekierowaniem wszystkiego do /dev/null, ale to nie pomogło.

Ma ktoś jakiś pomysł jak to ogarnąć?

#linux #bash
  • 6
@BoKoR:

Po pierwsze nie widzę sensu uruchamiania skryptu skrypt.sh w ten sposób:

0 * * * * /home/test/skrypt.sh >> log.txt 2>&1
Lepiej zrób to w taki sposób:

0 * * * * /home/test/skrypt.sh
Teraz, zmodyfikuj swój skrypt.sh:

__

#!/usr/bin/env bash


exec 3>> /tmp/log.txt
{
polecenie_pobierające_archiwum_tar;
polecenie_rozpakowujące_pobrane_archiwum_tar;
inne_polecenie;
} 1>&3 2>&1
exec 3>&-
polecenie_dupa &>/dev/null
___

To wszystko.
@BoKoR: Napisałem ogólnie w jaki sposób przekierować STDOUT i STDERR pewnej grupy poleceń do pliku /tmp/log.txt, a polecenia "dupa1" do /dev/null.

Jak pewnie zdążyłeś już zauważyć za pomocą polecenia exec otwieram i zamykam dodatkowy deskryptor nr 3, który jest powiązany z dopisywaniem do poliku /tmp/log.txt. Nawiasy klamrowe { } pozwalają na uruchomienie grupy poleceń bez odpalania ich w podpowłoce (sub-shellu) i przekierowania ich deskryptorów nr 1 (stdout)