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
Zain Rafi
sumber
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
Terkait longgar: Apa kontrol dan pengalihan operator shell?
G-Man Mengatakan 'Reinstate Monica'
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.

dr01
sumber
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).

Claus Andersen
sumber
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