English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

重定向输入输出Shell

La maggior parte dei comandi del sistema UNIX accetta l'input dal terminale e invia i risultati di output al terminale. Un comando di solito legge l'input da un luogo chiamato input standard, per impostazione predefinita, questo è il terminale. Allo stesso modo, un comando di solito scrive l'output sullo standard output, per impostazione predefinita, questo è anche il terminale.

L'elenco dei comandi di ridirezione è il seguente:

Comando Spiegazione
command > file Ridireziona l'output a file.
command < file Ridireziona l'input a file.
command >> file Ridireziona l'output in appendimento a file.
n > file Ridireziona il file descrittore n del file a file.
n >> file Ridireziona il file descrittore n del file in appendimento a file.
n >& m Unisci i file di output m e n.
n <& m Unisci i file di input m e n.
<< tag Considera il contenuto tra i tag di inizio tag e il tag di fine come input.

È necessario notare che il descrittore di file 0 è di solito l'input standard (STDIN), 1 è l'output standard (STDOUT), 2 è l'output di errore standard (STDERR).

Reindirizzamento dell'output

Il reindirizzamento è generalmente realizzato inserendo simboli specifici tra i comandi. In particolare, la sintassi di questi simboli è come segue:

command1 > file1

Questo comando esegue command1 e memorizza il contenuto dell'output nel file file1.

Attenzione: il contenuto esistente all'interno di file1 sarà sostituito dal nuovo contenuto. Se si desidera aggiungere il nuovo contenuto alla fine del file, utilizzare l'operatore >>.

示例在线

Esegui il comando who seguente, che reindirizza l'output completo del comando nel file utente (users):

$ who > users

Dopo l'esecuzione, non ci sono state informazioni output nel terminale, perché l'output è stato reindirizzato al dispositivo di output standard predefinito (terminale) al file specificato.

Puoi utilizzare il comando cat per visualizzare il contenuto del file:

$ cat users
_mbsetupuser console  Ott  31 17:35 
tianqixin    console  Ott  31 17:35 
tianqixin    ttys000  Dic  1 11:33

Il reindirizzamento dell'output sovrascrive il contenuto del file, vedere l'esempio seguente:

$ echo "Sito web della guida di base: it.oldtoolbag.com" > users
$ cat users
Sito web della guida di base: it.oldtoolbag.com
$

Se non si desidera che il contenuto del file venga sovrascritto, è possibile utilizzare >> per aggiungere al fondo del file, ad esempio:

$ echo "Sito web della guida di base: it.oldtoolbag.com" >> users
$ cat users
Sito web della guida di base: it.oldtoolbag.com
Sito web della guida di base: it.oldtoolbag.com
$

Reindirizzamento dell'input

Allo stesso modo del reindirizzamento dell'output, i comandi Unix possono anche ottenere l'input da un file, la sintassi è:

command1 < file1

In questo modo, i comandi che avrebbero richiesto l'input da tastiera vengono trasferiti alla lettura di contenuti da un file.

Attenzione: la reindirizzamento dell'output è rappresentato dal simbolo '>', mentre il reindirizzamento dell'input è rappresentato dal simbolo '<'.

示例在线

Continuando con l'esempio precedente, dobbiamo contare il numero di righe del file users, eseguiamo il seguente comando:

$ wc -l users
       2 users

Puoi anche reindirizzare l'input al file users:

$ wc -l < users
       2

Attenzione: i risultati dei due esempi precedenti sono diversi: nel primo esempio, viene outputto il nome del file; nel secondo non lo è, perché sa solo leggere il contenuto dall'input standard.

command1 < infile > outfile

Sostituisci contemporaneamente l'input e l'output, esegui command1, leggi il contenuto dal file infile e scrivi l'output nel file outfile.

Spiegazione approfondita della ridirezione

Di solito, ogni comando Unix/Linux apre tre file durante l'esecuzione:

  • File di input standard (stdin): Il descrittore di file di stdin è 0, i programmi Unix leggono dati di default dal stdin.

  • File di output standard (stdout): Il descrittore di file di stdout è 1, i programmi Unix scrivono dati di output di default nel stdout.

  • File di errore standard (stderr): Il descrittore di file di stderr è 2, i programmi Unix scrivono informazioni di errore nel flusso stderr.

Di default, command > file ridirige stdout a file, command < file ridirige stdin a file.

Se si desidera ridirezionare stderr a un file, si può scrivere così:

$ command 2>file

Se si desidera aggiungere stderr alla fine del file, si può scrivere così:

$ command 2>>file

2 Rappresenta il file di errore standard (stderr).

Se si desidera ridirezionare stdout e stderr in un file combinato, si può scrivere così:

$ command > file 2>&1
o
$ command >> file 2>&1

Se si desidera ridirezionare sia stdin che stdout, si può scrivere così:

$ command < file1 >file2

Il comando command ridirige stdin a file1 e stdout a file2.

Here Document

Here Document è un modo speciale di ridirezionamento degli input nel Shell, utilizzato per ridirezionare gli input a uno script o programma Shell interattivo.

La sua forma di base è la seguente:

command << delimiter
    document
delimiter

Il suo ruolo è trasmettere il contenuto (document) tra i due delimiter come input al comando.

注意:

  • Il delimiter alla fine deve essere allineato a sinistra, senza alcun carattere prima o dopo, inclusi spazi e tabulazioni.

  • Gli spazi prima e dopo il delimiter vengono ignorati.

示例在线

在命令行中通过 wc -l 命令计算 Here Document 的行数:

$ wc -l << EOF
    欢迎来到
    网站教程基础
    it.oldtoolbag.com
EOF
3          # 输出结果为 3 行
$

我们也可以将 Here Document 用在脚本中,例如:

#!/bin/bash
# author:网站教程基础
# url:it.oldtoolbag.com
cat << EOF
欢迎来到
网站教程基础
it.oldtoolbag.com
EOF

执行以上脚本,输出结果:

欢迎来到
网站教程基础
it.oldtoolbag.com

文件 /dev/null

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

$ command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

$ command > /dev/null 2>&1

注意:0 是输入标准(STDIN),1 是输出标准(STDOUT),2 是输出错误标准(STDERR)。

这里 2> 空格不可以之间2> 一体表示错误输出才