Perbedaan antara "kucing" dan "kucing <"

Jawaban:

106

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.

Thomas Dickey
sumber
83
Ya, dan misalnya bisa Anda lakukan sudo cat myfile.txt. Tetapi sudo cat < myfile.txttidak akan berfungsi jika Anda tidak memiliki hak istimewa untuk membaca file.
zuazo
2
Catatan yang ksh93telah catbuiltin (tidak diaktifkan secara default kecuali Anda memiliki /opt/ast/binawal Anda $PATH).
Stéphane Chazelas
2
Beberapa program berperilaku berbeda tergantung pada apakah mereka mendapatkan argumen nama file atau stdin. Misalnya, wcakan mencetak nama file sebelum hitungan ketika diberi argumen.
Barmar
21

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.

Jlliagre
sumber
5
Karena penasaran, apakah Anda benar-benar menggunakan kshkemauan Anda sendiri, dan jika demikian ... mengapa ?
kucing
1
@ kucing - pertanyaan itu jelas didasarkan pada ketidaktahuan. bangun sendiri dan lihat.
mikeserv
2
@ mikeserv yang dimaksudkan untuk menjadi kurang ajar, tidak serius kasar, tapi cukup adil, saya kira
kucing
2
@ kucing - saya kira tidak sebaliknya. ketidaktahuan bukanlah hal yang memalukan - itu hanya kurangnya pengetahuan. jika Anda tidak mengerti mengapa seseorang mungkin memilih untuk menggunakan ksh93, maka saya hanya bisa berasumsi itu karena Anda belum pernah menggunakannya. jadi saya sarankan Anda lakukan. layak untuk dicoba, untuk memastikan. dan percayalah ketika saya katakan, bahwa, dibandingkan dengan bash, ksh93jauh dan lebih baik shell. itu yang shell, hampir.
mikeserv
5
Seperti @mikeserv tunjukkan di tempat lain , 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.)
Wildcard
7

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.

Hamza Abbad
sumber
6

@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.

sasha
sumber
1
Perhatikan bahwa pada contoh pertama Anda catakan tetap terbuka file1dan file2, sama dengan file4dan file5pada contoh ketiga Anda. Itu hanya akan ditampilkan file3, resp. file6isi jika instruksi terbuka sebelumnya berhasil.
jlliagre
@ jlliagre, terima kasih, saya tidak tahu itu. Strace jelas membuktikan kebenaran Anda. Saya mengoreksi teks tanda kurung untuk kasus 1 dan 3a.
sasha
0

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.

pengguna307770
sumber