Bagaimana cara mengarahkan output ke layar serta file?

12

Tujuan saya adalah untuk mencatat semua output dari skrip ke direktori yang akan dibuat skrip.

Sebagai contoh, saya punya:

~/.abc.sh:

#! /bin/bash
rails new myapp

Ketika saya berlari ...

cd ~/code
. ~/.abc.sh

... yang akan membuat aplikasi Rails baru di direktori ~/code/myapp.

Ketika Rails membuat aplikasi, ia mengeluarkan banyak teks yang ingin saya tangkap dan simpan dalam file log di direktori yang sama dengan railsperintah yang baru dibuat. Saya juga ingin menampilkan teks itu di terminal juga.

Bagaimana cara saya melakukan ini?

Zabba
sumber

Jawaban:

23

Anda dapat menggunakan teeperintah untuk itu:

command | tee /path/to/logfile

The equivelent tanpa menulis ke shell adalah:

command > /path/to/logfile

Jika Anda ingin menambahkan ( >>) dan menampilkan output di shell, gunakan -aopsi:

command | tee -a /path/to/logfile

Harap dicatat bahwa pipa hanya akan menangkap stdout, kesalahan pada stderr tidak diproses oleh pipa dengan tee. Jika Anda ingin mencatat kesalahan (dari stderr), gunakan:

command 2>&1 | tee /path/to/logfile

Ini berarti: jalankan commanddan redirect stream stderr (2) ke stdout (1). Itu akan diteruskan ke pipa dengan teeaplikasi.

Lekensteyn
sumber
Apakah yang Anda maksud ~/.abc.sh | tee <file>? Jika demikian, maka masalahnya adalah saya tidak tahu di direktori mana skrip akan membuat aplikasi ketika saya menyebutnya, jadi bagaimana saya tahu apa yang harus diberikan dalam fileargumen? (Terima kasih atas contoh-contohnya)
Zabba
@Zabba: bagaimana dengan membuat file sementara dan memindahkannya setelah itu?
Lekensteyn
Ok, itu seharusnya berhasil :). Sehubungan dengan itu, bagaimana cara membuat file temp dengan nama acak yang kemudian dapat saya output dan kemudian salin ke lokasi yang diinginkan setelah itu? Apakah ada perintah bawaan untuk mendapatkan "temp file name"?
Zabba
@Zabba: perintah untuk itu mktemp. Lihat halaman manual man mktemp.
Lekensteyn
跪拜, bekerja seperti pesona
Sun Junwen
0

scriptakan memulai sesi interaktif dan mencatat semua output (stdout / stderr dll) ke file, atau (dengan -cparameter) akan menjalankan perintah dan mencatat outputnya.

script -c ~/.abc.sh -f abc.log

Catatan: dalam sesi interaktif, Anda dapat berhenti merekam hanya dengan keluar dari sesi seperti biasa (misalnya exitatau Ctrl-D).

Untuk merekam sesi dengan pemutaran video, Anda juga dapat mencoba asciinema .

mwfearnley
sumber