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.
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.
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.
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.
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.
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.
Jawaban:
Dalam kasus pertama,
cat
buka file, dan dalam kasus kedua, shell membuka file, meneruskannya sebagaicat
input standar.Secara teknis, mereka dapat memiliki efek yang berbeda. Sebagai contoh, adalah mungkin untuk memiliki implementasi shell yang lebih (atau kurang) diistimewakan daripada
cat
program. 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
cat
bukan program yang sama.sumber
sudo cat myfile.txt
. Tetapisudo cat < myfile.txt
tidak akan berfungsi jika Anda tidak memiliki hak istimewa untuk membaca file.ksh93
telahcat
builtin (tidak diaktifkan secara default kecuali Anda memiliki/opt/ast/bin
awal Anda$PATH
).wc
akan 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.txt
dalam direktori saat ini, atau jika Anda tidak diizinkan untuk membacanya.Dalam kasus sebelumnya,
cat
akan mengeluh dan dalam kasus terakhir, shell Anda akan, dengan jelas menunjukkan proses mana yang mencoba untuk membuka file,cat
di yang pertama dan shell di yang terakhir.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 terakhircat
kecuali Anda menggunakanzsh
danmultios
"zshism" -nya.Pada sistem standar, shell dan
cat
tidak memiliki perbedaan dalam hak akses file sehingga keduanya akan gagal sama rata. Menggunakansudo
untuk meningkatkancat
hak istimewa akan membuat perbedaan besar dalam perilaku, seperti yang sudah disarankan oleh Thomas Dickey dan komentar terlampir.sumber
ksh
kemauan Anda sendiri, dan jika demikian ... mengapa ?bash
,ksh93
jauh dan lebih baik shell. itu yang shell, hampir.cat < file1 > file2
memiliki efek yang sangat berbeda daricat file1 > file2
dalam kasus di manafile1
tidak dapat dibaca atau tidak ada. (Bentuk terakhir memotongfile2
; yang pertama tidak akan.)cat myfile.txt
membaca filemyfile.txt
kemudian mencetaknya ke output standar.cat < myfile.txt
di sinicat
tidak diberikan file apa pun untuk dibuka, jadi - seperti banyak perintah Unix - membaca data dari input standar, yang diarahkan ke sana darifile.txt
shell, dan mencetak ke output standar.sumber
@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 <file3
hanya 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 file3
akan 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.sumber
cat
akan tetap terbukafile1
danfile2
, sama denganfile4
danfile5
pada contoh ketiga Anda. Itu hanya akan ditampilkanfile3
, resp.file6
isi jika instruksi terbuka sebelumnya berhasil.kita dapat menggunakan perintah lain untuk memperhatikan perbedaan antara:
Output yang mungkin:
perintah memberitahu nama file karena ia tahu itu (dilewatkan sebagai argumen).
Output yang mungkin:
input standar dialihkan ke file food2.txt tanpa perintah mengetahuinya.
sumber