Sebelum shell mengeksekusi cat
perintah pada baris perintah, shell mencari pengalihan.
Ada dua pengalihan:
>file1
Ini akan membuat output standar perintah pergi ke file1
.
<file2
Ini akan membuat input standar perintah berasal file2
.
Fakta bahwa pengalihan ini ditempatkan di lokasi miring pada baris perintah tidak masalah.
$ cat <file2 >file1
sama dengan
$ <file2 cat >file1
yang sama dengan
$ <file2 >file1 cat
dll
Perhatikan bahwa cat
utilitas dalam semua instance ini dijalankan tanpa argumen baris perintah . Pengalihan bukan operan ke cat
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
dan cat <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 hubungkan cat
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 fitur cat
, 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 untuk cat
dan untuk beberapa utilitas lain (yaitu tidak ada yang shell lakukan). Untuk menggunakan cat
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 jika file2
tidak dapat diakses (pengalihan diurai dari kiri ke kanan). Namun, penempatan relatif kata cat
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:
$ sort file >file
Di sini, shell akan memotong (mengosongkan) file file
sebelum mengeksekusi sort file
dan menghubungkan sort
output standar ke file. The sort
utilitas maka akan membuka file
dan menyortir isinya (yang ada). Hasilnya (tidak ada) dilewatkan melalui aliran output standar ke file
.
Obat dalam kasus khusus ini (untuk menyortir file "di tempat") adalah
$ sort -o file file
atau
$ sort file >file.sorted && mv file.sorted file
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:
"Perintah sederhana" adalah urutan penugasan dan pengarahan variabel opsional, dalam urutan apa pun, secara opsional diikuti oleh kata-kata dan pengalihan, diakhiri oleh operator kontrol. [ref: POSIX Shell Command Language 2.9.1 Perintah Sederhana]
Dan juga tentang pengalihan bukan menjadi bagian dari operan utilitas:
Nomor opsional, operator pengalihan, dan kata tidak akan muncul dalam argumen yang disediakan untuk perintah yang akan dieksekusi (jika ada). [ref: POSIX Shell Command Language 2.7 Redirection]