Bagaimana saya bisa mendapatkan perintah tac di OS X?


59

Saya suka menggunakan tacuntuk membalikkan output dari cat. Namun, itu tidak tersedia di terminal Mavericks. Saya mencoba menemukannya di MacPorts dan lagi tidak tersedia. Adakah yang bisa tunjukkan padaku bagaimana cara mendapatkannya tac? Ini sangat membantu untuk membaca file log.

Jawaban:


66

Iya:

  • Instal Homebrew
  • brew install coreutils
  • ln -s /usr/local/bin/gtac /usr/local/bin/tac rupanya tidak diperlukan dengan Homebrew terbaru, lihat komentar oleh Ran Ever-Hadani di bawah ini

atau gunakan MacPorts untuk menginstal coreutilsdengan cara yang serupa.


Saya tidak mengerti bagaimana ln -s /usr/local/bin/gtac /usr/local/bin/tacmembuatnya bekerja ... Bukankah perintah itu hanya untuk membuat daftar beberapa blok memori file?
Timothy Swan

1
Symlink hanya untuk kenyamanan. Homebrew menginstal binari coreutil di / usr / local / bin dengan mengawali nama aslinya dengan 'g'. lsmenjadi gls, headmenjadi gheaddan seterusnya. Akibatnya, tacdipasang sebagai gtac, dan symlink yang disarankan dalam jawaban ini hanya untuk membuat tactersedia dengan nama itu. Menghilangkan symlink, Anda masih dapat menjalankan program sebagai gtac.
grebneke

Oh Anda sedang berbicara tentang ln -stidak. ls -sIni lebih masuk akal sekarang. Saya harus memasukkannya dengan benar saat pertama kali.
Timothy Swan

2
Tambahan untuk jawaban grebneke : tidak perlu tautan lunak lagi. Akhiran g sekarang hanya ditambahkan jika osx sudah memiliki perintah dengan nama itu, jadi tac diinstal sebagai tac, bukan gtac.
Ran Ever-Hadani

70

Pada OS / X seperti pada banyak sistem (BSD, Solaris, AIX, IRIX ...), fungsionalitas GNU tactersedia taildengan -r opsi . Jadi tidak perlu menginstal GNU tac:

tail -r the-file

11
Jadi, alias tac='tail -r'akan melakukan trik untuk OP!
mkc

8
Yah, sebenarnya menggunakan alias shell mungkin gagal karena alias tidak ditransfer ke skrip shell. Gunakan fungsi sepertitac() { tail -r -- "$@"; }
kojiro


0

Satu solusi sementara bisa berupa:

alias tac='perl -e "print reverse(<>)"'

1
Ini hanya membuat saya belajar bahwa <>tidak hanya membaca dari STDIN, tetapi juga opsional dari @ARGV. stackoverflow.com/questions/29020883/... Saya masih tidak tahu apakah reverseakan memuat seluruh file ke dalam memori sebelum mengeluarkan baris dalam urutan terbalik. Itu akan mengerikan.
Bruno Bronosky

@BrunoBronosky,> ... STDIN, tetapi secara opsional dari @ ARGV: ya itulah gunanya <>. > ... akan memuat seluruh file ke dalam memori ...: YA, ITU AKAN! (hindari melakukan ini dengan file gigabyte)
JJoao
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.