GNU/Linux >> Znalost Linux >  >> Linux

Zabránit odeslání příkazu Stdout i Stderr do libovolného terminálu nebo souboru?

Tato otázka zde již obsahuje odpovědi :přesměrování na /dev/null

(6 odpovědí)
Uzavřeno před 6 lety.

Chtěl bych zabránit tomu, aby můj program posílal stdout a stderr na jakékoli terminály, soubory nebo zařízení. Napadají mě proto tři příkazy, ale nedokážu rozlišit jejich rozdíly. Mohl byste mi prosím vysvětlit význam každého z nich.

# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1

Přijatá odpověď:

# ./run > /dev/null

Toto přesměruje stdout na /dev/null , ale se stderr to nedělá vůbec nic. Protože jste požádali o přesměrování ze stdout a stderr, nedělá to, co chcete.

# ./run > /dev/null 1>&2

Toto přesměruje stdout na /dev/null a poté znovu přesměruje stdout (1> ) kamkoli, kam ukazuje stderr (&2 ), což je pravděpodobně terminál a je pravděpodobně tam, kam stdout ukazoval, než jste jej přesměrovali. Čistým efektem zde tedy není (pravděpodobně) žádná přesměrování pro stdout, a pokud jde o stderr, stále s tím nic nenaděláte. Takže to také není to, co chcete.

# ./run > /dev/null 2>&1

Toto přesměruje stdout na /dev/null a poté přesměruje stderr (2> ) kamkoli, kam ukazuje stdout, což je /dev/null protože jste to právě přesměrovali. Zdá se, že to je to, co chcete.

Nedokážu rozlišit jejich rozdíly.

Ve skutečnosti byste měli být schopni odlišit rozdíly docela snadno. Řekněme ./run obsahuje toto:

#!/bin/sh
echo stdout
echo stderr >&2

Výsledky by pak měly být následující:

# ./run > /dev/null
stderr
# ./run > /dev/null 1>&2
stdout
stderr
# ./run > /dev/null 2>&1

Rozdíl je jasný!


Linux
  1. Jak namapovat zařízení /dev/sdX a /dev/mapper/mpathY ze zařízení /dev/dm-Z

  2. Co jsou soubory /dev/zero a /dev/null v Linuxu

  3. Jak spustit soubor sh z jiného souboru sh

  1. Jak vytvořit soubor v Linuxu z okna terminálu?

  2. /dev/sdb:Žádný takový soubor nebo adresář (ale /dev/sdb1 atd. existuje)

  3. Linux:Rozdíl mezi /dev/console , /dev/tty a /dev/tty0

  1. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  2. Shell:přesměrujte stdout na /dev/null a stderr na stdout

  3. Vytvořte virtuální blokové zařízení, které zapisuje do /dev/null