Saya sedang mengerjakan tutorial dan melihat penggunaan keduanya cat myfile.txt
dan cat < myfile.txt
. Apakah ada perbedaan antara dua urutan perintah ini? Sepertinya keduanya mencetak isi file ke shell.
Saya sedang mengerjakan tutorial dan melihat penggunaan keduanya cat myfile.txt
dan cat < myfile.txt
. Apakah ada perbedaan antara dua urutan perintah ini? Sepertinya keduanya mencetak isi file ke shell.
Jawaban:
Dalam kasus pertama, cat
buka file, dan dalam kasus kedua, shell membuka file, meneruskannya sebagai cat
input standar.
Secara teknis, mereka dapat memiliki efek yang berbeda. Sebagai contoh, adalah mungkin untuk memiliki implementasi shell yang lebih (atau kurang) diistimewakan daripada cat
program. Untuk skenario itu, yang satu mungkin gagal membuka file, sementara yang lain bisa.
Itu bukan skenario yang biasa, tetapi disebutkan untuk menunjukkan bahwa shell dan cat
bukan program yang sama.
sudo cat myfile.txt
. Tetapi sudo cat < myfile.txt
tidak akan berfungsi jika Anda tidak memiliki hak istimewa untuk membaca file.
ksh93
telah cat
builtin (tidak diaktifkan secara default kecuali Anda memiliki /opt/ast/bin
awal Anda $PATH
).
wc
akan mencetak nama file sebelum hitungan ketika diberi argumen.
Tidak ada perbedaan nyata yang terlihat dalam test case Anda. Yang paling jelas adalah pesan kesalahan yang Anda dapatkan jika tidak ada file yang disebutkan myfile.txt
dalam direktori saat ini, atau jika Anda tidak diizinkan untuk membacanya.
Dalam kasus sebelumnya, cat
akan mengeluh dan dalam kasus terakhir, shell Anda akan, dengan jelas menunjukkan proses mana yang mencoba untuk membuka file, cat
di yang pertama dan shell di yang terakhir.
$ cat myfile.txt
cat: myfile.txt: No such file or directory
$ cat < myfile.txt
ksh93: myfile.txt: cannot open [No such file or directory]
Dalam kasus yang lebih umum, perbedaan utama menggunakan pengalihan tidak dapat digunakan untuk mencetak konten lebih dari satu file, yang setelah semua tujuan asli perintah cat
(yaitu cat enate) perintah. Perhatikan bahwa shell akan tetap mencoba membuka semua file yang diteruskan sebagai input yang dialihkan, tetapi hanya benar-benar meneruskan yang terakhir cat
kecuali Anda menggunakan zsh
dan multios
"zshism" -nya.
$ echo one > one
$ echo two > two
$ cat one two # cat opens one, shows one, opens two, shows two
one
two
$ cat < one < two # sh opens one then opens two, cat shows stdin (two)
two
$ rm one two
$ echo one > one
$ cat one two # cat opens and shows one, fails to open two
one
cat: two: No such file or directory
$ cat < one < two # the shell opens one then opens two, fails and
# displays an error message, cat gets nothing on stdin
# so shows nothing
ksh93: two: cannot open [No such file or directory]
Pada sistem standar, shell dan cat
tidak memiliki perbedaan dalam hak akses file sehingga keduanya akan gagal sama rata. Menggunakan sudo
untuk meningkatkan cat
hak istimewa akan membuat perbedaan besar dalam perilaku, seperti yang sudah disarankan oleh Thomas Dickey dan komentar terlampir.
ksh
kemauan Anda sendiri, dan jika demikian ... mengapa ?
bash
, ksh93
jauh dan lebih baik shell. itu yang shell, hampir.
cat < file1 > file2
memiliki efek yang sangat berbeda dari cat file1 > file2
dalam kasus di mana file1
tidak dapat dibaca atau tidak ada. (Bentuk terakhir memotong file2
; yang pertama tidak akan.)
cat myfile.txt
membaca file myfile.txt
kemudian mencetaknya ke output standar.
cat < myfile.txt
di sini cat
tidak diberikan file apa pun untuk dibuka, jadi - seperti banyak perintah Unix - membaca data dari input standar, yang diarahkan ke sana dari file.txt
shell, dan mencetak ke output standar.
@Thomas Dickey jawabannya brilian.
Saya hanya ingin menambahkan beberapa fakta yang jelas tentang kasus membaca beberapa file (terkait longgar dengan pertanyaan Anda, tetapi masih):
cat <file1 <file2 <file3
hanya akan membaca file3, setidaknya dalam bash. (Sebenarnya, ini tergantung pada shell, tetapi kebanyakan shell akan meng - dup setiap file yang ditentukan ke stdin, yang menyebabkan yang terakhir berpengaruh.)cat file1 file2 file3
akan membaca semua file yang ditentukan secara berurutan (sebenarnya cat disingkat dari kata concatenate ).cat file1 file2 file3 <file4 <file5 <file6
hanya akan membaca file1, file2, file3 (seperti cat mengabaikan stdin ketika argumen nama file dilewatkan).
cat file1 file2 - file3 <file4 <file5 <file6
akan membaca file1, file2, file6, file3 (karena tanda hubung memaksa cat untuk tidak mengabaikan stdin).Dan tentang kesalahan. Jika tidak dapat membuka beberapa file yang ditentukan sebagai argumen (tanpa <
), cat akan melewatkan file yang gagal (dengan menampilkan pesan yang relevan ke stderr), tetapi masih membaca file lain. Dalam hal ketidakmampuan untuk membuka setidaknya satu file yang ditentukan sebagai pengalihan (dengan <
), shell bahkan tidak akan memulai cat (ini terjadi bahkan untuk pengalihan sebenarnya tidak digunakan oleh cat). Dalam kedua kasus, kode keluar yang salah akan dikembalikan.
cat
akan tetap terbuka file1
dan file2
, sama dengan file4
dan file5
pada contoh ketiga Anda. Itu hanya akan ditampilkan file3
, resp. file6
isi jika instruksi terbuka sebelumnya berhasil.
kita dapat menggunakan perintah lain untuk memperhatikan perbedaan antara:
wc –w food2.txt
.
Output yang mungkin:
6 food2.txt
.
perintah memberitahu nama file karena ia tahu itu (dilewatkan sebagai argumen).
wc –w < food2.txt
.
Output yang mungkin:
6
.
input standar dialihkan ke file food2.txt tanpa perintah mengetahuinya.