Saya memiliki file bernama my_file.txt
yang isinya hanya string Hello
. Bagaimana saya bisa mengarahkan kontennya ke perintah echo
?
Saya tahu saya memiliki perintah less
, cat
, more
... tapi aku harus melakukannya dengan echo
.
Saya mencoba ini:
$ cat my_file.txt | echo
dan juga ini:
$ echo < my_file.txt
Tetapi dalam kedua kasus itu hanya muncul kosong di stdout, bukan konten my_file.txt.
Bagaimana saya bisa melakukan itu?
shell
io-redirection
echo
danielmbcn
sumber
sumber
echo
?\n
,b
...) dalam file, yang akan menjadi penggunaan yang validecho
(setidaknya standarecho
). Atau mungkin dia ingin mengerti mengapa itu tidak bekerja seperti itu. Bagaimanapun, tidak ada alasan untuk menurunkan IMO.Jawaban:
Anda dapat mengalihkan semua yang Anda inginkan
echo
tetapi tidak akan melakukan apa-apa dengannya.echo
tidak membaca input standarnya. Yang dilakukannya hanyalah menulis ke output standar, argumennya dipisahkan oleh karakter spasi dan diakhiri oleh karakter baris baru (dan dengan beberapaecho
implementasi dengan beberapa urutan escape di dalamnya diperluas dan / atau argumen dimulai dengan-
kemungkinan diperlakukan sebagai opsi).Jika Anda ingin
echo
menampilkan konten file, Anda harus meneruskan konten itu sebagai argumenecho
. Sesuatu seperti:Perhatikan bahwa
$(...)
strip baris baru karakter s dari output dari yangcat
perintah, danecho
menambahkan satu kembali.Perhatikan juga bahwa kecuali dengan
zsh
, Anda tidak dapat melewatkan karakter NUL dalam argumen perintah, sehingga di atas biasanya tidak akan bekerja dengan file biner.yash
juga akan menghapus byte yang tidak membentuk bagian dari karakter yang valid.Jika alasan karena ingin melakukan itu adalah karena Anda ingin
echo
memperluas\n
,\b
,\0351
... escape sequence dalam file (seperti conformant UNIXecho
implementasi lakukan, tetapi tidak semua ), maka Anda lebih suka menggunakanprintf
gantinya :Berlawanan dengan itu
echo
, yang portabel dan tidak akan memiliki masalah jika konten file dimulai-
.Sebagai alternatif untuk
$(cat file)
, denganksh
,zsh
danbash
, satu juga dapat melakukan:$(<file)
. Itu adalah operator khusus di mana shell sebagai lawancat
membaca konten file untuk membuat ekspansi. Masih menghapus baris baru yang tertinggal dan tersedak pada byte NUL kecuali padazsh
. Dalambash
, itu masih membutuhkan proses tambahan. Juga perhatikan bahwa satu perbedaan adalah bahwa Anda tidak akan mendapatkan kesalahan jika mencoba membaca file direktori jenis seperti itu. Selain itu, meskipun$(< file)
spesial,$(< file; other command)
tidak (dalamzsh
, ketika tidak meniru shell lain, itu masih akan memperluas kontenfile
, dengan menjalankan perintah implisit$READNULLCMD
(biasanya pager)).sumber
cat
dan hanya memiliki shell membacanya secara langsung:echo "$(<my_file.txt)"
.$(<filename)
.Menambahkan ke jawaban lain, Anda juga dapat mencoba pengalihan input
cat
atau
$()
dan `` melakukan hal yang sama, mereka menjalankan perintah di dalam ruang lingkup mereka dan memberikan output ke shell seolah-olah itu diberikan sebagai input oleh pengguna. Satu-satunya perbedaan antara keduanya adalah $ () dapat bersifat rekursif dan `` tidak dapat bersifat rekursif.sumber
Jawaban sederhana: Anda tidak bisa.
echo
(baik itu shell built-in atau biner biasa) tidak memproses input standar - itu hanya satu arah.sumber
Seperti yang dikatakan,
Misalnya, Anda dapat melakukannya dengan ini
xargs
(mengingat bahwa Anda perlu mengaktifkan interpretasi backslash lolos ):Atau hanya apa yang Anda minta (tanpa interpretasi urutan lolos ):
sumber
xargs echo
(sama denganxargs
btw sepertiecho
halnya perintah default), itu adalahecho
perintah dari sistem file yang akan dijalankan, bukanecho
perintah builtin shell . Perhatikan juga bahwaxargs
mengharapkan inputnya dalam format yang sangat spesifik (di mana kosong, baris baru, kutipan, garis miring terbalik memiliki arti khusus).cat
tidak masuk akal di sini karena ada hanya satu file ke concatenate (sama seperti< file.txt xargs echo
Perhatikan bahwa Unix compliant.echo
s melakukan ekspansi melarikan diri backslash secara default dan output-e
padaecho -e
.Dalam bash, hal-hal berikut juga harus berfungsi:
Bagian dalam backticks digantikan oleh output dari perintah itu, yaitu dalam hal ini diganti dengan konten file.
sumber
$( . . . )
. Orang yang menggunakan$()
biasanya lebih suka karena Anda bisa membuat sarang. Pertanyaan ini sudah tua, namun, jauh lebih memuaskan untuk menjawab pertanyaan yang belum dijawab!my_file.txt
berisi*
, itu akan mencetak daftar nama file di direktori saat ini.