Apa yang telanjang lakukan?

10

bash tampaknya tidak mengeluh jika Anda menjalankan perintah suka

$ < some-file-that-exists

Sepertinya tidak ada yang terjadi.

Anda juga bisa menggunakannya

$ <<<"any string"

dan bahkan memproses substitusi.

Jadi apa sebenarnya yang dilakukan, dan mengapa itu dibolehkan Apakah ini berguna untuk apa saja?

Pil Ledakan
sumber
BTW: Untuk ZSH yang hebat, "<foobar" sama dengan "less foobar", seperti foobar redirect Anda ke shell. Saya pikir ini adalah perilaku yang cukup intuitif. Telanjang <akan memberi Anda kesalahan ( zsh: parse error near `\n') karena tidak ada argumen yang diberikan.
matematika
@math Anda akan mendapatkan kesalahan serupa bash, tapi itu menarik less.
Pil Ledakan

Jawaban:

20

<mengatur pengalihan untuk perintah yang dapat terjadi sebelum atau sesudah instruksi pengalihan. Yaitu

$ < file wc

berfungsi juga

$ wc < file

Tetapi jika Anda tidak memberikan perintah, bash menyiapkan pengalihan dan tidak melakukan hal lain. Untuk pengalihan input, jumlah ini sama dengan apa yang Anda lihat, tidak ada, jika file ada dan dapat dibaca. Jika file tersebut tidak ada atau tidak dapat dibaca, bash akan menandakan kesalahan. Untuk pengalihan output, file output akan dibuat jika tidak ada. File output apa pun yang ada akan terpotong jika >digunakan; tidak ada pemotongan jika >>digunakan.

Kyle Jones
sumber
dengan kata lain mereka ringkas ada dan buat
ratchet freak
@ Kyle Jones Saya pikir Anda tidak cocok dengan dua operator di kalimat terakhir.
jamesbtate
@ Puddingfox Terima kasih. Saya telah mengedit kalimat run-on di akhir untuk memperjelas.
Kyle Jones
Apakah ada alasan untuk menggunakan < file wcvs wc < file?
Pil Ledakan
1
@tandu Sangat berguna saat menggunakan cangkang interaktif. Katakanlah Anda memiliki perintah yang menggunakan pengalihan dan Anda ingin mengulanginya dengan argumen terakhir yang berbeda. Jika pengalihan berada di awal baris, mudah untuk mengetik control-P dan kemudian mengedit argumen terakhir tanpa harus melewati "<foo> bar 2> & 1" bahasa seperti yang Anda lakukan jika itu pada akhirnya. Selain itu, saya tidak menemukan gunanya.
Kyle Jones
5

<membaca dari stdin secara default, atau file. ekspresi Anda tidak melakukan apa pun dengan input karena Anda tidak melakukan anyting setelah membaca.

Jika Anda melakukan <file-file-yang-ada> di filefile di akhir, maka Anda akan melihat bahwa Anda baru saja membaca konten file pertama dan menulisnya ke file kedua.

<<< di sini adalah format doc, jadi ini membaca dari string, bukan dari file. cat <<< "string apa saja" untuk melihat apa yang telah Anda baca.

johnshen64
sumber
2
untuk referensi di masa mendatang, harap edit jawaban Anda untuk menambahkan detail alih-alih menambahkan komentar
Nate Koppenhaver
2
"Jika Anda melakukan <file-file-yang-ada> outputfile di akhir maka Anda akan melihat bahwa Anda baru saja membaca konten file pertama dan menulisnya ke file kedua." Ini salah; tanpa perintah file output akan terpotong menjadi nol byte.
Kyle Jones