Saya sedang mengerjakan tutorial dan melihat penggunaan keduanya cat myfile.txtdan 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.txtdan cat < myfile.txt. Apakah ada perbedaan antara dua urutan perintah ini? Sepertinya keduanya mencetak isi file ke shell.
Jawaban:
Dalam kasus pertama, catbuka file, dan dalam kasus kedua, shell membuka file, meneruskannya sebagai catinput standar.
Secara teknis, mereka dapat memiliki efek yang berbeda. Sebagai contoh, adalah mungkin untuk memiliki implementasi shell yang lebih (atau kurang) diistimewakan daripada catprogram. 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 catbukan program yang sama.
sudo cat myfile.txt. Tetapi sudo cat < myfile.txttidak akan berfungsi jika Anda tidak memiliki hak istimewa untuk membaca file.
ksh93telah catbuiltin (tidak diaktifkan secara default kecuali Anda memiliki /opt/ast/binawal Anda $PATH).
wcakan 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.txtdalam direktori saat ini, atau jika Anda tidak diizinkan untuk membacanya.
Dalam kasus sebelumnya, catakan mengeluh dan dalam kasus terakhir, shell Anda akan, dengan jelas menunjukkan proses mana yang mencoba untuk membuka file, catdi 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 catkecuali Anda menggunakan zshdan 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 cattidak memiliki perbedaan dalam hak akses file sehingga keduanya akan gagal sama rata. Menggunakan sudountuk meningkatkan cathak istimewa akan membuat perbedaan besar dalam perilaku, seperti yang sudah disarankan oleh Thomas Dickey dan komentar terlampir.
kshkemauan Anda sendiri, dan jika demikian ... mengapa ?
bash, ksh93jauh dan lebih baik shell. itu yang shell, hampir.
cat < file1 > file2memiliki efek yang sangat berbeda dari cat file1 > file2dalam kasus di mana file1tidak dapat dibaca atau tidak ada. (Bentuk terakhir memotong file2; yang pertama tidak akan.)
cat myfile.txtmembaca file myfile.txtkemudian mencetaknya ke output standar.
cat < myfile.txtdi sini cattidak diberikan file apa pun untuk dibuka, jadi - seperti banyak perintah Unix - membaca data dari input standar, yang diarahkan ke sana dari file.txtshell, 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 <file3hanya 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 file3akan 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.
catakan tetap terbuka file1dan file2, sama dengan file4dan file5pada contoh ketiga Anda. Itu hanya akan ditampilkan file3, resp. file6isi 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.