คำตอบ:
ใช้script
คำสั่ง มันจะคัดลอกทุกอย่างที่ไปที่หน้าจอในไฟล์
script -c "sudo apt-get install things" script-file.script
script
ส่งเอาต์พุตคำสั่งไปยังไฟล์ แต่ไม่แสดงบนหน้าจอ
script -c "history" ~/hist.txt
และเห็นผลลัพธ์ที่ระบุScript started
และScript done
แต่ฉันไม่เห็นผลลัพธ์จากคำสั่งจริงบนหน้าจอ
history
เป็นเชลล์ที่สร้างขึ้นไม่ใช่คำสั่งภายนอก สิ่งที่เกิดขึ้นคือ: 1) สคริปต์เริ่มทำงาน 2) สคริปต์ค้นหาคำสั่งประวัติไม่พบดังนั้นจึงเดาได้ว่าควรรันผ่านเชลล์ 3) สคริปต์รันคำสั่งhistory
ผ่านเชลล์ 4) เชลล์ใหม่เริ่มทำงานและดำเนินการคำสั่งประวัติภายใน เนื่องจากนี่เป็นเชลล์ที่ไม่ใช่เชิงโต้ตอบใหม่ประวัติจึงไม่มีอะไรจะพูด
script
ยังสามารถเรียกใช้แบบโต้ตอบ เพียงพิมพ์script
ที่พรอมต์คำสั่ง คุณจะได้รับเชลล์ใหม่และคำสั่งใด ๆ ที่คุณพิมพ์จะมีการบันทึกเอาต์พุต พิมพ์exit
เพื่อจบเชลล์และบันทึกไฟล์ ตามค่าเริ่มต้นเอาต์พุตจะถูกเรียกtypescript
และมันจะมีทุกอย่างที่แสดงบนหน้าจอของคุณไม่ว่าคุณจะพิมพ์หรือมันเป็นเอาท์พุทของคำสั่ง history
คำสั่งควรจะยังคงมีอยู่ในเปลือกใหม่เช่นกัน
คุณสามารถใช้tee
คำสั่งเพื่อทำสิ่งนี้ให้สำเร็จ
sudo apt-get install someapp 2>&1 | tee ~/someappInstall.txt
ดูที่นี่สำหรับข้อมูลเพิ่มเติมหรือดำเนินการman tee
หมายเหตุ: ตามที่คนอื่น ๆ ได้กล่าวไว้2>&1
จำเป็นต้องเปลี่ยนเส้นทาง STDERR ไปยัง STDOUT เพื่อตรวจจับข้อผิดพลาด ดูคำถาม StackOverflow นี้สำหรับคำอธิบายที่ดีเกี่ยวกับสิ่งที่2>&1
ทำ
script
การใช้คำสั่ง ดังนั้นข้อดีเช่นการทุบตีเสร็จจะง่ายกว่าสำเร็จ
-c "something ..."
: ถ้าจะปล่อยคุณไปยังเชลล์และเสร็จสิ้นเมื่อคุณออกจากเชลล์นั้น อนุญาตให้ใช้คำสั่งหลายคำสั่ง ฯลฯ นอกจากนี้ยังมี "การจัดรูปแบบ" ข่าวสารเพิ่มเติมทำให้สามารถเล่นซ้ำสิ่งต่าง ๆ ได้ (เช่น: หน้าจอที่ชัดเจน ฯลฯ ) (แต่ยังสามารถทำให้เอาท์พุต ... ymmv)
|&
แทนการ2>&1 |
ทุบตี
tee
จะทำงานตามที่ต้องการ
ในการดักจับเอาต์พุตเป็นไฟล์ให้ใช้:
sudo apt-get install your_software | tee log_file.txt
สิ่งนี้จะดักจับเอาท์พุทเท่านั้น แต่ไม่รวมถึงข้อความแสดงข้อผิดพลาด หากคุณต้องการบันทึกข้อความแสดงข้อผิดพลาดให้แก้ไขคำสั่งเป็น:
sudo apt-get install your_software 2>&1 | tee log_file.txt
bash
การสนับสนุน|&
ผู้ประกอบการ , sudo apt-get install your_software |& tee log_file.txt
ท่อทั้งสองจะstdoutและstderrtee
ไป (ความรุ่งโรจน์ถึงJF Sebastianผู้แนะนำสิ่งนี้ในที่อื่น )
หนึ่งในความงามของ apt-get (และ APT ทั่วไป) คือการที่พวกเขาเก็บล็อกไฟล์เกือบทุกอย่างแม้กระทั่งการส่งออกที่ขั้วของคำสั่งใด ๆ /var/log/apt
ที่คุณเรียกใช้รางใน ตัวอย่างเช่นนี่เป็นรายการสุดท้ายใน/var/log/apt/term.log
:
Log started: 2014-06-20 16:46:08
(Reading database ... 252472 files and directories currently installed.)
Removing xdotool (1:3.20130111.1-3.1) ...
Processing triggers for man-db (2.6.7.1-1) ...
Log ended: 2014-06-20 16:46:33
ตอนนี้เปรียบเทียบกับผลลัพธ์ที่แท้จริง:
➜ ~ sudo apt-get remove xdotool
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libxdo3
Use 'apt-get autoremove' to remove it.
The following packages will be REMOVED:
xdotool
0 upgraded, 0 newly installed, 1 to remove and 2 not upgraded.
After this operation, 135 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 252472 files and directories currently installed.)
Removing xdotool (1:3.20130111.1-3.1) ...
Processing triggers for man-db (2.6.7.1-1) ...
มันบันทึกฉันหลายบรรทัดที่ไม่เกี่ยวข้องในกรณีส่วนใหญ่และมันจะทำโดยอัตโนมัติ ดังนั้นคุณไม่ต้องการคำสั่งพิเศษใด ๆ เพื่อทำสิ่งที่คุณต้องการทำ apt-get ทำเพื่อคุณ
apt-get
ใช่มั้ย?