Anggap file2
sudah ada, perintahnya
> file1 < file2 cat
tampaknya menyalin konten file2
ke file1
.
Tetapi saya tidak dapat memahami struktur ini.
Saya mengerti bahwa "Tidak Ada" sedang diarahkan file1
, (membuat atau menghapus kontennya). Kemudian konten file2
diarahkan ke file1
.
Kenapa cat
setelah file2
? bagaimana ia tahu cat file2
jika operan tidak dalam urutan yang benar?
shell
io-redirection
shaqed
sumber
sumber
Jawaban:
Sebelum shell mengeksekusi
cat
perintah pada baris perintah, shell mencari pengalihan.Ada dua pengalihan:
>file1
Ini akan membuat output standar perintah pergi kefile1
.<file2
Ini akan membuat input standar perintah berasalfile2
.Fakta bahwa pengalihan ini ditempatkan di lokasi miring pada baris perintah tidak masalah.
sama dengan
yang sama dengan
dll
Perhatikan bahwa
cat
utilitas dalam semua instance ini dijalankan tanpa argumen baris perintah . Pengalihan bukan operan kecat
perintah, itu adalah instruksi ke shell untuk mengatur pengalihan masuk dan keluar dari perintah (menghubungkan input dan output standar ke file). Shell mengatur pengalihan sebelum menjalankan perintah.Perbedaan antara
cat file
dancat <file
(atau, jika Anda mau,<file cat
) adalah bahwa dalam kasus pertama,cat
utilitas itu sendiri membuka file, yang diberikan sebagai operan pada baris perintah, untuk membaca, sedangkan dalam kasus kedua, shell akan buka file dan hubungkancat
aliran input ke sana². Dalam kasus kedua,cat
akan melihat itu tidak diberikan file operan dan secara otomatis akan beralih ke membaca dari input standarnya. Ini adalah fiturcat
, dan beberapa utilitas lain, bukan sesuatu yang dilakukan semua utilitas.cat
juga akan membaca dari input standarnya jika diberi operan-
. Sekali lagi, ini hanya khusus untukcat
dan untuk beberapa utilitas lain (yaitu tidak ada yang shell lakukan). Untuk menggunakancat
pada file dalam direktori saat ini yang namanya adalah-
, tambahkan jalan untuk nama file, seperti./-
.¹ Urutan pengalihan masih penting dalam beberapa keadaan; Dengan
cat <file2 >file1
, misalnya,file1
tidak akan terpotong jikafile2
tidak dapat diakses (pengalihan diurai dari kiri ke kanan). Namun, penempatan relatif katacat
tersebut masih arbitrer dan tidak akan memengaruhi ini.² Lihat juga pertanyaan " cat memberikan kesalahan berbeda saat membuka file yang tidak ada ".
Fakta bahwa shell mengatur pengalihan bahkan sebelum mengeksekusi perintah pada baris perintah adalah mengapa hal-hal seperti ini gagal dan Anda berakhir dengan file output kosong:
Di sini, shell akan memotong (mengosongkan) file
file
sebelum mengeksekusisort file
dan menghubungkansort
output standar ke file. Thesort
utilitas maka akan membukafile
dan menyortir isinya (yang ada). Hasilnya (tidak ada) dilewatkan melalui aliran output standar kefile
.Obat dalam kasus khusus ini (untuk menyortir file "di tempat") adalah
atau
yang lebih atau kurang apa yang
sort
dilakukan saat menggunakan-o
file untuk menentukan nama file output.Hanya untuk mendukung pernyataan bahwa pengalihan dapat mendahului nama sebenarnya dari utilitas pada baris perintah:
Dan juga tentang pengalihan bukan menjadi bagian dari operan utilitas:
sumber
<in foo | bar >out
menempatkan semuanya dalam urutan logis. Saya juga suka jikaecho >&2 Something bad happened
untuk output kesalahan dari skrip shell. Tetapi>out <in cat
hanya kebingungansort file >file
dicapai dengan benar?sort -o file file
.< file1 > file2 cat
akan lebih baik daripada> file2 < file1 cat
itu akan menghindarifile2
terpotong jikafile1
tidak bisa dibuka.