cat memberikan kesalahan yang berbeda saat membuka file yang tidak ada


22

Kedua perintah berikut mencoba untuk membuka file yang tidak ada foo, tetapi pesan kesalahannya sedikit berbeda. Apa yang bisa menjadi alasannya?

$ cat foo
cat: cannot open foo
$ cat < foo
-bash: foo: No such file or directory

12
Guys, tolong jangan downvote posting hanya berdasarkan format, terutama untuk posting yang berasal dari pendatang baru. Ini pertanyaan yang sangat valid.
Stéphane Chazelas

21
Seharusnya cat < foodbukancat < foo
Tulains Córdova

6
@ TulainsCórdova Atau, dalam beberapa budaya,; food < cat)
DepressedDaniel


1
Hanya kesalahan pertama yang berasal cat. Sekarang, saya ingin tahu dari mana pesan kedua datang, mengingat bahwa itu dimulai dengan bash:...
Dmitry Grigoryev

Jawaban:


30
cat foo

Ini menjalankan catperintah dengan argumen foo. Kesalahan yang tercetak pada layar tergantung sepenuhnya pada apa yang diputuskan oleh pemrogram perintah.

cat < foo 

Ini mengumpankan isi file fooke catperintah dengan menggunakan pengalihan stdin Bash . Jika file tidak ada, Bash yang mengeluhkannya.


20

Di $ cat fooshell (di sini bash) mengeksekusi catperintah dan melewati parameter foo. Program cat memilih untuk menafsirkan parameter itu sebagai nama file - dan mencoba untuk membuka file tersebut. Kesalahan yang Anda lihat adalah dari program kucing yang (secara alami) tidak dapat membuka file.

Versi $ cat < fooini adalah pengalihan yang ditangani oleh shell. <adalah operator shell yang menginstruksikan shell untuk membuka file dan mengarahkannya ke stdin. File tidak ada sehingga Anda mendapatkan "Tidak ada file seperti itu". Kali ini kesalahannya berasal dari shell (bash) dan terlihat sedikit berbeda.

Inilah sebabnya mengapa Anda melihat 2 kesalahan berbeda. Penyebabnya sama - tetapi berasal dari 2 program yang berbeda (cat dan bash).


18
Tidak. Dalam cat < foo, cattidak dipanggil jika pengalihan gagal. Itu (dan memiliki pesan kesalahan yang konsisten) adalah salah satu alasan mengapa lebih baik menggunakan pengalihan jika memungkinkan. Juga pertimbangkan cat < in > outvs di cat in > outmana mantan mencegah outditimpa jika intidak ada (shell membatalkan perintah setelah < inpengalihan gagal dan tidak melakukan > outpengalihan berikutnya , apalagi memanggil cat).
Stéphane Chazelas

Keren! Logika murni. Saya akan mengedit omong kosong saya.
Claus Andersen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.