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
command-line
io-redirection
cat
Zain Rafi
sumber
sumber
cat < food
bukancat < foo
food < cat
)cat
. Sekarang, saya ingin tahu dari mana pesan kedua datang, mengingat bahwa itu dimulai denganbash:
...Jawaban:
Ini menjalankan
cat
perintah dengan argumenfoo
. Kesalahan yang tercetak pada layar tergantung sepenuhnya pada apa yang diputuskan oleh pemrogram perintah.Ini mengumpankan isi file
foo
kecat
perintah dengan menggunakan pengalihan stdin Bash . Jika file tidak ada, Bash yang mengeluhkannya.sumber
Di
$ cat foo
shell (di sini bash) mengeksekusicat
perintah dan melewati parameterfoo
. 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 < foo
ini 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).
sumber
cat < foo
,cat
tidak dipanggil jika pengalihan gagal. Itu (dan memiliki pesan kesalahan yang konsisten) adalah salah satu alasan mengapa lebih baik menggunakan pengalihan jika memungkinkan. Juga pertimbangkancat < in > out
vs dicat in > out
mana mantan mencegahout
ditimpa jikain
tidak ada (shell membatalkan perintah setelah< in
pengalihan gagal dan tidak melakukan> out
pengalihan berikutnya , apalagi memanggilcat
).