Ubah hala input/output shell


Kebanyakan perintah sistem UNIX menerima input daripada terminal anda dan menghantar output yang terhasil kembali ke terminal anda. Perintah biasanya membaca input dari tempat yang dipanggil input standard, yang kebetulan terminal anda secara lalai. Begitu juga, arahan biasanya menulis outputnya kepada output standard, yang juga terminal anda secara lalai.

Senarai arahan ubah hala adalah seperti berikut:

命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

Perlu diambil perhatian bahawa deskriptor fail 0 biasanya adalah input standard (STDIN), 1 ialah output standard (STDOUT), dan 2 ialah output ralat standard (STDERR).


Ubah hala keluaran

Ubah hala biasanya dicapai dengan memasukkan simbol khusus antara arahan. Khususnya, sintaks simbol ini adalah seperti berikut:

command1 > file1

Arahan di atas melaksanakan perintah1 dan kemudian menyimpan kandungan output dalam fail1.

Perhatikan bahawa mana-mana kandungan sedia ada dalam fail1 akan digantikan dengan kandungan baharu. Jika anda ingin menambah kandungan baharu pada penghujung fail, gunakan operator >>

Instance

Laksanakan arahan who berikut, yang akan mengubah hala keluaran lengkap arahan dalam fail pengguna (pengguna):

$ who > users

Selepas pelaksanaan, tiada terminal Maklumat output kerana output telah diubah hala dari peranti output standard lalai (terminal) ke fail yang ditentukan.

Anda boleh menggunakan arahan kucing untuk melihat kandungan fail:

$ cat users
_mbsetupuser console  Oct 31 17:35 
tianqixin    console  Oct 31 17:35 
tianqixin    ttys000  Dec  1 11:33

Alihan semula output akan menimpa kandungan fail, sila lihat contoh berikut:

$ echo "php中文网:www.php.cn" > users
$ cat users
php中文网:www.php.cn
$

Jika anda tidak melakukannya mahu kandungan fail ditimpa , anda boleh menggunakan >> untuk menambah pada penghujung fail, contohnya:

$ echo "php中文网:www.php.cn" >> users
$ cat users
php中文网:www.php.cn
php中文网:www.php.cn
$

Pengubah hala input

Seperti pengalihan keluaran, Unix arahan juga boleh mendapatkan input daripada fail, sintaksnya ialah :

command1 < file1

Dengan cara ini, arahan yang pada asalnya memerlukan input daripada papan kekunci akan dipindahkan untuk membaca kandungan daripada fail.

Nota: Ubah hala keluaran lebih besar daripada tanda (>), ubah hala input kurang daripada tanda (<).

Contoh

Berikutan contoh di atas, kita perlu mengira bilangan baris dalam fail pengguna, laksanakan arahan berikut:

$ wc -l users
       2 users

Anda juga boleh mengubah hala input ke fail pengguna:

$  wc -l < users
       2

Nota: Keputusan dua contoh di atas adalah berbeza: contoh pertama akan mengeluarkan nama fail; yang kedua tidak akan, kerana ia hanya tahu membaca kandungan daripada input standard.

command1 < infile > outfile

Ganti input dan output pada masa yang sama, laksanakan arahan1, baca kandungan daripada fail dalam fail, dan kemudian tulis output ke fail luar.

Penjelasan mendalam tentang pengalihan

Secara amnya, tiga fail akan dibuka apabila setiap arahan Unix/Linux dijalankan:

  • Fail input standard (stdin): Deskriptor fail stdin ialah 0, dan program Unix membaca data daripada stdin secara lalai.

  • Fail output standard (stdout): Deskriptor fail stdout ialah 1. Program Unix mengeluarkan data ke stdout secara lalai.

  • Fail ralat standard (stderr): Deskriptor fail stderr ialah 2, dan program Unix akan menulis maklumat ralat ke aliran stderr.

Secara lalai, perintah > fail mengubah hala stdout ke fail dan perintah <

Jika anda mahu stderr dialihkan ke fail, anda boleh menulis seperti ini:

$ command 2 > file

Jika anda mahu stderr dilampirkan pada penghujung fail, anda boleh menulis seperti ini:

$ command 2 >> file

2 mewakili fail ralat standard (stderr).

Jika anda ingin menggabungkan stdout dan stderr dan mengubah halanya ke fail, anda boleh menulis seperti ini:

$ command > file 2>&1

或者

$ command >> file 2>&1

Jika anda ingin mengubah hala kedua-dua stdin dan stdout, anda boleh menulis seperti ini:

$ command < file1 >file2
<🎜 Perintah >arahan mengubah hala stdin ke fail1 dan stdout ke fail2.


Here Document

Here Document ialah kaedah ubah hala khas dalam Shell, digunakan untuk mengubah hala input ke skrip atau program Shell interaktif.

Bentuk asasnya adalah seperti berikut:

command << delimiter
    document
delimiter

Fungsinya adalah untuk menghantar kandungan (dokumen) antara dua pembatas sebagai input kepada arahan.

Nota:

  • Pembatas pada penghujung mesti ditulis dalam format atas. Tidak boleh ada sebarang aksara di hadapannya dan tidak boleh ada sebarang aksara di belakang, termasuk ruang dan inden tab.

  • Ruang sebelum dan selepas pembatas awal akan diabaikan.

Contoh

Kira bilangan baris Here Document melalui arahan wc -l pada baris arahan:

rreee

Kita boleh juga gunakan Here Document digunakan dalam skrip, contohnya:

$ wc -l << EOF
    欢迎来到
    php中文网
    www.php.cn
EOF
3          # 输出结果为 3 行
$

Laksanakan skrip di atas dan hasil keluarannya ialah:

#!/bin/bash
# author:php中文网
# url:www.php.cn

cat << EOF
欢迎来到
php中文网
www.php.cn
EOF

/dev/null File

Jika anda ingin melaksanakan arahan tertentu, Tetapi anda tidak mahu memaparkan hasil output pada skrin, maka anda boleh mengubah hala output ke /dev/null:

欢迎来到
php中文网
www.php.cn

/dev/null is a fail khas, dan kandungan yang ditulis kepadanya akan dibuang jika anda cuba membaca daripada fail ini, tiada apa yang akan dibaca. Walau bagaimanapun, fail /dev/null sangat berguna Mengalihkan output arahan kepadanya akan mempunyai kesan "melumpuhkan output".

Jika anda ingin menyekat stdout dan stderr, anda boleh menulis seperti ini:

$ command > /dev/null

Nota: 0 ialah input standard (STDIN), 1 ialah standard output (STDOUT), 2 ialah output ralat standard (STDERR).