ฉันจะบันทึกเอาต์พุตของคำสั่งไปยังไฟล์ได้อย่างไร?
มีวิธีโดยไม่ใช้ซอฟต์แวร์ใด ๆ ? ฉันต้องการทราบวิธีการ
ฉันจะบันทึกเอาต์พุตของคำสั่งไปยังไฟล์ได้อย่างไร?
มีวิธีโดยไม่ใช้ซอฟต์แวร์ใด ๆ ? ฉันต้องการทราบวิธีการ
คำตอบ:
ใช่มันเป็นไปได้เพียงแค่เปลี่ยนเส้นทางการส่งออกไปยังไฟล์:
SomeCommand > SomeFile.txt
หรือถ้าคุณต้องการผนวกข้อมูล:
SomeCommand >> SomeFile.txt
ถ้าคุณต้องการstderr
ใช้เช่นนี้:
SomeCommand &> SomeFile.txt
หรือสิ่งนี้เพื่อผนวก:
SomeCommand &>> SomeFile.txt
หากคุณต้องการให้ทั้งสองstderr
และเอาท์พุทแสดงบนคอนโซลและในไฟล์ใช้สิ่งนี้:
SomeCommand 2>&1 | tee SomeFile.txt
(ถ้าคุณต้องการเอาท์พุทเท่านั้นวาง2
ด้านบน)
make
คำสั่งลงในไฟล์มันต้องใช้ไวยากรณ์นี้แทน: make > someFile.txt 2>&1
(ที่มา: linuxquestions.org/questions/linux-newbie-8/… )
ในการเขียนเอาต์พุตของคำสั่งไปยังไฟล์นั้นมี 10 วิธีที่ใช้กันทั่วไป
โปรดทราบว่า
n.e.
ในคอลัมน์ไวยากรณ์หมายถึง "ไม่มีอยู่"
มีวิธี แต่มันซับซ้อนเกินไปที่จะใส่ลงในคอลัมน์ คุณสามารถค้นหาลิงค์ที่มีประโยชน์ในส่วนรายการเกี่ยวกับมัน
|| visible in terminal || visible in file || existing
Syntax || StdOut | StdErr || StdOut | StdErr || file
==========++==========+==========++==========+==========++===========
> || no | yes || yes | no || overwrite
>> || no | yes || yes | no || append
|| | || | ||
2> || yes | no || no | yes || overwrite
2>> || yes | no || no | yes || append
|| | || | ||
&> || no | no || yes | yes || overwrite
&>> || no | no || yes | yes || append
|| | || | ||
| tee || yes | yes || yes | no || overwrite
| tee -a || yes | yes || yes | no || append
|| | || | ||
n.e. (*) || yes | yes || no | yes || overwrite
n.e. (*) || yes | yes || no | yes || append
|| | || | ||
|& tee || yes | yes || yes | yes || overwrite
|& tee -a || yes | yes || yes | yes || append
command > output.txt
สตรีมเอาต์พุตมาตรฐานจะถูกเปลี่ยนเส้นทางไปยังไฟล์เท่านั้นจะไม่สามารถมองเห็นได้ในเทอร์มินัล หากไฟล์มีอยู่แล้วไฟล์นั้นจะถูกเขียนทับ
command >> output.txt
สตรีมเอาต์พุตมาตรฐานจะถูกเปลี่ยนเส้นทางไปยังไฟล์เท่านั้นจะไม่สามารถมองเห็นได้ในเทอร์มินัล หากไฟล์มีอยู่แล้วข้อมูลใหม่จะถูกต่อท้ายไฟล์
command 2> output.txt
สตรีมข้อผิดพลาดมาตรฐานจะถูกเปลี่ยนเส้นทางไปยังไฟล์เท่านั้นจะไม่ปรากฏในเทอร์มินัล หากไฟล์มีอยู่แล้วไฟล์นั้นจะถูกเขียนทับ
command 2>> output.txt
สตรีมข้อผิดพลาดมาตรฐานจะถูกเปลี่ยนเส้นทางไปยังไฟล์เท่านั้นจะไม่ปรากฏในเทอร์มินัล หากไฟล์มีอยู่แล้วข้อมูลใหม่จะถูกต่อท้ายไฟล์
command &> output.txt
ทั้งเอาต์พุตมาตรฐานและสตรีมข้อผิดพลาดมาตรฐานจะถูกเปลี่ยนเส้นทางไปยังไฟล์เท่านั้นจะไม่มีสิ่งใดปรากฏในเทอร์มินัล หากไฟล์มีอยู่แล้วไฟล์นั้นจะถูกเขียนทับ
command &>> output.txt
ทั้งเอาต์พุตมาตรฐานและสตรีมข้อผิดพลาดมาตรฐานจะถูกเปลี่ยนเส้นทางไปยังไฟล์เท่านั้นจะไม่มีสิ่งใดปรากฏในเทอร์มินัล หากไฟล์มีอยู่แล้วข้อมูลใหม่จะถูกต่อท้ายไฟล์
command | tee output.txt
สตรีมเอาต์พุตมาตรฐานจะถูกคัดลอกไปยังไฟล์ซึ่งจะยังคงปรากฏให้เห็นในเทอร์มินัล หากไฟล์มีอยู่แล้วไฟล์นั้นจะถูกเขียนทับ
command | tee -a output.txt
สตรีมเอาต์พุตมาตรฐานจะถูกคัดลอกไปยังไฟล์ซึ่งจะยังคงปรากฏให้เห็นในเทอร์มินัล หากไฟล์มีอยู่แล้วข้อมูลใหม่จะถูกต่อท้ายไฟล์
(*)
Bash ไม่มีไวยากรณ์จดชวเลขที่อนุญาตให้วางเฉพาะ StdErr ไปยังคำสั่งที่สองซึ่งจำเป็นต้องใช้ร่วมกับtee
อีกครั้งเพื่อทำให้ตารางเสร็จสมบูรณ์ หากคุณต้องการอะไรแบบนั้นจริงๆโปรดดูที่"จะไปป์ stderr อย่างไรและไม่ใช่ stdout" บน Stack Overflowสำหรับวิธีการนี้สามารถทำได้เช่นโดยการสลับการสตรีมหรือการใช้การทดแทนกระบวนการ
command |& tee output.txt
ทั้งเอาต์พุตมาตรฐานและสตรีมข้อผิดพลาดมาตรฐานจะถูกคัดลอกไปยังไฟล์ในขณะที่ยังคงมองเห็นได้ในเทอร์มินัล หากไฟล์มีอยู่แล้วไฟล์นั้นจะถูกเขียนทับ
command |& tee -a output.txt
ทั้งเอาต์พุตมาตรฐานและสตรีมข้อผิดพลาดมาตรฐานจะถูกคัดลอกไปยังไฟล์ในขณะที่ยังคงมองเห็นได้ในเทอร์มินัล หากไฟล์มีอยู่แล้วข้อมูลใหม่จะถูกต่อท้ายไฟล์
2>&1
เปลี่ยนเส้นทาง STDERR ไปยัง STDOUT 1>&2
เปลี่ยนเส้นทาง STDOUT ไปยัง STDERR และ3>&1
จะเปลี่ยนเส้นทางสตรีม 3 ไปยัง STDERR
sh: 1: Syntax error: "&" unexpected
เมื่อฉันใช้|& tee
จากสคริปต์ Python ในเซิร์ฟเวอร์ c9.io ดูเหมือนว่ามีการใช้เปลือกที่แตกต่างกัน echo $SHELL
แสดง/bin/bash
และ$SHELL --version
แสดงเวอร์ชัน 4.3.11 (1) - ปล่อย ฉันพยายาม#!/bin/bash
ในสคริปต์หลามของฉัน sh: 1: Syntax error
แต่ฉันยังคงได้รับ ฉันได้สิ่งที่ฉันต้องการดังนั้นฉันจึงยอมแพ้ในการคัดแยกความแปลกประหลาดระหว่างsh
และbash
บนเซิร์ฟเวอร์ของฉัน ขอบคุณ
sh
และไม่ใช่bash
(หรืออาจbash
อยู่ในsh
โหมด ... ) คุณสามารถตรวจสอบว่ากระบวนการเชลล์ปัจจุบันของคุณกำลังใช้ps -p $$ -o cmd=
งานecho $SHELL
อะไรอยู่เพราะไม่น่าเชื่อถือและจะแสดงเชลล์ล็อกอินให้คุณโดยไม่สนใจว่าคุณอาจเริ่มเชลล์ย่อยอื่นหรือไม่
คุณยังสามารถใช้tee
เพื่อส่งออกไปยังไฟล์:
command | tee ~/outputfile.txt
การปรับเปลี่ยนเล็กน้อยจะจับ stderr เช่นกัน:
command 2>&1 | tee ~/outputfile.txt
หรือสั้นกว่าเล็กน้อยและซับซ้อนน้อยกว่า:
command |& tee ~/outputfile.txt
tee
จะเป็นประโยชน์ถ้าคุณต้องการที่จะสามารถที่จะจับออกคำสั่งในขณะที่ยังดูมันอยู่
2>&1
อย่างไร
คุณสามารถเปลี่ยนเส้นทางผลลัพธ์คำสั่งไปยังไฟล์:
your_command >/path/to/file
ในการผนวกเอาต์พุตคำสั่งต่อท้ายไฟล์แทนที่จะเขียนทับมันให้ใช้:
your_command >>/path/to/file
การปรับปรุงที่จะต้องพิจารณา -
สคริปต์ต่าง ๆ จะใส่รหัสสีลงในผลลัพธ์ซึ่งคุณอาจไม่ต้องการให้ไฟล์บันทึกของคุณยุ่งเหยิง
หากต้องการแก้ไขปัญหานี้คุณสามารถใช้โปรแกรมsedจะตัดออกรหัสเหล่านั้น ตัวอย่าง:
command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
ls
และgrep
รองรับ--color=auto
ซึ่งเอาต์พุตโค้ดสีเฉพาะเมื่อเอาต์พุตมาตรฐานคือเทอร์มินัล
สำหรับcron
งานอื่น ๆ ที่คุณต้องการหลีกเลี่ยง Bash extension ตัวsh
ดำเนินการเปลี่ยนเส้นทางPOSIX ที่เทียบเท่าคือ
Bash POSIX
------------ --------------
foo &> bar foo >bar 2>&1
foo &>> bar foo >>bar 2>&1
foo |& bar foo 2>&1 | bar
คุณจะสังเกตเห็นว่าสิ่งอำนวยความสะดวก POSIX นั้นเรียบง่ายและตรงไปตรงมามากกว่า &>
ไวยากรณ์ที่ถูกยืมมาจากcsh
ที่แล้วควรโน้มน้าวให้คุณว่ามันเป็นความคิดที่ดี
some_command | tee command.log
และsome_command > command.log
มีปัญหาที่พวกเขาไม่ได้บันทึกเอาท์พุทคำสั่งลงในcommand.log
ไฟล์แบบเรียลไทม์
เพื่อหลีกเลี่ยงปัญหาดังกล่าวและบันทึกผลลัพธ์คำสั่งแบบเรียลไทม์คุณอาจผนวกunbuffer
ซึ่งมาพร้อมกับexpect
แพ็คเกจ
ตัวอย่าง:
sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log
สมมติว่าlog.py
ประกอบด้วย:
import time
print('testing')
time.sleep(100) # sleeping for 100 seconds
คุณสามารถเรียกใช้unbuffer python log.py | tee command.log
หรือunbuffer python log.py > command.log
ข้อมูลเพิ่มเติม: ฉันจะบันทึกเอาต์พุตคำสั่งลงในไฟล์แบบเรียลไทม์ได้อย่างไร?
someCommand 2> someFile.txt
และsomeCommand 2>> someFile.txt
ยังเปลี่ยนเส้นทางstterr
ไปยัง someFile.txt