Unix & Linux

คำถาม & คำตอบสำหรับผู้ใช้ Linux, FreeBSD และระบบปฏิบัติการ Un * x อื่น ๆ

7
หมดเวลาในเชลล์สคริปต์
ฉันมีสคริปต์เชลล์ที่อ่านจากอินพุตมาตรฐาน ในกรณีที่หายากจะมีไม่มีใครพร้อมที่จะให้การป้อนข้อมูลและสคริปต์ที่ต้องหมดเวลา ในกรณีที่หมดเวลาสคริปต์จะต้องเรียกใช้โค้ดการล้างข้อมูล วิธีที่ดีที่สุดในการทำเช่นนั้นคืออะไร? สคริปต์นี้ต้องพกพาได้มากรวมถึงระบบยูนิกซ์ในศตวรรษที่ 20 ที่ไม่มีคอมไพเลอร์ C และอุปกรณ์ฝังตัวที่ใช้งานอยู่ในขณะนี้ดังนั้น Perl, ทุบตี, ภาษาใด ๆ ที่คอมไพล์และแม้แต่ POSIX.2 แบบเต็มไม่สามารถพึ่งพาได้ โดยเฉพาะอย่างยิ่ง$PPID, read -tและกับดักที่ดีเลิศ POSIX สอดคล้องไม่สามารถใช้ได้ การเขียนไปยังไฟล์ชั่วคราวจะถูกแยกออกเช่นกัน สคริปต์อาจทำงานแม้ว่าระบบไฟล์ทั้งหมดจะถูกเมาท์แบบอ่านอย่างเดียว เพียงเพื่อทำให้สิ่งต่าง ๆ ยากขึ้นฉันยังต้องการให้สคริปต์มีความรวดเร็วพอสมควรเมื่อไม่ได้หมดเวลา โดยเฉพาะอย่างยิ่งฉันยังใช้สคริปต์ใน Windows (ส่วนใหญ่ใน Cygwin) โดยที่ fork และ exec มีระดับต่ำโดยเฉพาะดังนั้นฉันจึงต้องการใช้ให้น้อยที่สุด โดยสรุปฉันมี trap cleanup 1 2 3 15 foo=`cat` และฉันต้องการเพิ่มการหมดเวลา ฉันไม่สามารถแทนที่catด้วยในreadตัว ในกรณีที่หมดเวลาฉันต้องการใช้งานcleanupฟังก์ชั่น พื้นหลัง: สคริปต์นี้คาดเดาการเข้ารหัสของเครื่องโดยพิมพ์อักขระ 8 บิตและเปรียบเทียบตำแหน่งเคอร์เซอร์ก่อนและหลัง …
53 shell  signals  timeout 

9
การสำรองข้อมูลที่เพิ่มขึ้นอย่างง่ายดายไปยังฮาร์ดไดรฟ์ภายนอก
ในขณะที่ฉันใช้ Dirvish เพื่อทำการสำรองข้อมูลส่วนเพิ่มของเครื่องของฉัน แต่มันค่อนข้างยุ่งยากในการกำหนดค่าและถ้าคุณไม่ได้พกสำเนาการกำหนดค่าของคุณ ฉันกำลังมองหาโปรแกรมสำรองข้อมูลสำหรับ Unix, Linux ที่สามารถ: อัปเดตการสำรองข้อมูลของฉันเพิ่มเติม สร้างต้นไม้ "mirror" อย่างที่ dirvish ใช้โดยใช้ลิงก์ (เพื่อประหยัดเนื้อที่) เป็นการดีที่มี UI ที่ดี
53 linux  backup  bsd 

10
รายการแพคเกจที่ติดตั้งอย่างชัดเจน
ใน Gentoo มีไฟล์/var/lib/portage/worldที่มีแพ็คเกจที่ฉันติดตั้งไว้อย่างชัดเจน โดยชัดแจ้งฉันหมายถึงแพ็คเกจที่ฉันเลือกไม่รวมสิ่งที่ติดตั้งเป็นค่าเริ่มต้นหรือถูกอ้างอิงโดยการอ้างอิง มีไฟล์ที่คล้ายกันหรือคำสั่งเพื่อค้นหาข้อมูลใน Ubuntu หรือไม่?

11
เครื่องมือสำหรับใช้การกำหนดค่า RandR โดยอัตโนมัติเมื่อเสียบจอแสดงผลภายนอก
มีเครื่องมือที่ช่วยให้หนึ่ง: จดจำการกำหนดค่า RandR ปัจจุบัน (ตำแหน่ง, การวางแนว, ความละเอียด ฯลฯ ) บนพื้นฐานต่อจอภาพ ใช้การกำหนดค่าที่ดีล่าสุดที่รู้จักโดยอัตโนมัติทันทีที่เสียบปลั๊กจอแสดงผลโดยไม่จำเป็นต้องโคลนรอบด้วย applets หรือ xrandr (1) การกำหนดค่าจะต้องนำมาใช้บนพื้นฐานต่อผู้ใช้ต่อการแสดงผล หากไม่มีเครื่องมือดังกล่าวอยู่ในป่าฉันต้องการที่จะรวมตัวเอง แต่เท่าที่ฉันเห็นไม่มีวิธีใดที่จะบอกได้ว่าเสียบจอภาพแล้วฉันต้องสำรวจด้วย xrandr -q นาน ๆ ครั้งจะคิดออกว่ามีการเชื่อมต่อหรือตัดการเชื่อมต่อหรือมีวิธีที่มีประสิทธิภาพมากขึ้นหรือไม่ udev สามารถปรับให้ทำเช่นนั้นได้หรือไม่?
53 linux  xorg  udev  xrandr 

5
ไฟล์มอนิเตอร์ (à la tail -f) ในไดเรกทอรีทั้งหมด (แม้แต่ไฟล์ใหม่)
tail -f directory/*ผมปกติดูบันทึกจำนวนมากในไดเรกทอรีทำ ปัญหาคือว่ามีการสร้างบันทึกใหม่หลังจากนั้นจะไม่แสดงในหน้าจอ (เนื่องจาก*ถูกขยายไปแล้ว) มีวิธีตรวจสอบไฟล์ทุกไฟล์ในไดเรกทอรีหรือไม่แม้กระทั่งไฟล์ที่สร้างขึ้นหลังจากกระบวนการเริ่มทำงาน
53 logs  tail 

4
ยกเว้นหนึ่งรูปแบบจากการจับคู่แบบกลม
ฉันมีหลายไฟล์ที่มีชื่อไฟล์ฐานเดียวกัน ฉันต้องการลบทั้งหมดยกเว้นหนึ่งรายการ foo.org #keep foo.tex #delete foo.fls #delete foo.bib #delete etc หากฉันไม่ต้องการเก็บไว้ฉันรู้ว่าฉันสามารถrm foo.*ใช้ได้ TLDPสาธิต^การคัดค้านการแข่งขัน จากการทดลองและข้อผิดพลาดฉันสามารถค้นพบสิ่งนั้นได้ rm foo.*[^org] ทำในสิ่งที่ฉันต้องการ แต่ฉันไม่เข้าใจไวยากรณ์ นอกจากนี้ในขณะที่ไม่ได้เป็นข้อ จำกัด ในกรณีที่ใช้งานของฉันฉันคิดว่ารูปแบบนี้ยังไม่สนใจและfoo.o foo.orรูปแบบนี้ทำงานอย่างไรและรูปทรงแบบใดที่ละเว้นเพียง foo.orgดูเหมือน
53 bash  wildcards 


4
ฉันจะเริ่มต้นเซสชันเชลล์ทั้งหมดในไดเรกทอรีอื่นที่ไม่ใช่ $ HOME ได้อย่างไร
เมื่อฉันเปิดเชลล์ที่ไม่ใช่การเข้าสู่ระบบใน Ubuntu ไดเรกทอรีการทำงานปัจจุบันของฉันคือ/home/user_name( $HOMEตัวแปรสภาพแวดล้อมของฉัน) แต่ฉันต้องการเปลี่ยนสิ่งนี้เมื่อฉันเริ่มเทอร์มินัลของฉันฉันอยู่ในไดเรกทอรีอื่น ฉันได้อ่านแล้วว่าเมื่อฉันเริ่มต้นเทอร์มินัลในอูบุนตูมี.bashrcไฟล์ที่มา ดังนั้นฉันเพิ่ม export HOME=/home/user_name/Documents ไปยัง.bashrcไฟล์ของฉัน ตอนนี้เมื่อฉันเปิดเครื่องฉันยังอยู่ใน/home/user_nameไดเรกทอรี ฉันจะเปลี่ยนสิ่งนี้ได้อย่างไร

3
wget with wildcard ในการดาวน์โหลด http
ฉันต้องดาวน์โหลดไฟล์โดยใช้ wget แต่ฉันไม่รู้ว่าชื่อไฟล์จะเป็นอะไร https://foo/bar.1234.tar.gz ตามหน้า man , wget ช่วยให้คุณสามารถปิดและ globbing เมื่อจัดการกับเว็บไซต์ ftp แต่ฉันมี URL http ฉันจะใช้ไวด์การ์ดในขณะที่ใช้ wget ได้อย่างไร ฉันใช้ gnu wget สิ่งที่ฉันได้ลอง /usr/local/bin/wget -r "https://foo/bar.*.tar.gz" -P /tmp ปรับปรุง การใช้ -A จะทำให้ไฟล์ทั้งหมดลงท้ายด้วย. tar.gz บนเซิร์ฟเวอร์เพื่อทำการดาวน์โหลด /usr/local/bin/wget -r "https://foo/" -P /tmp -A "bar.*.tar.gz" ปรับปรุง จากคำตอบนี่คือไวยากรณ์ที่ใช้งานได้ในที่สุด /usr/local/bin/wget -r -l1 -np "https://foo" -P /tmp -A …
53 wget 

2
ทำให้ xargs ผ่านเป็นพารามิเตอร์ตัวแรก
ฉันพยายามที่จะสร้างพฤติกรรมนี้: grep 192.168.1 *.txt โดยการส่งผ่านสตริงไปยัง grep ผ่าน Xargs แต่มันจะไปที่จุดสิ้นสุดแทนที่จะเป็นพารามิเตอร์ตัวแรก echo 192.168.1 | xargs grep *.txt ฉันต้องบอก xargs (หรือบางอย่างที่คล้ายกัน) เพื่อใส่สตริงที่เข้ามาระหว่าง 'grep' และ '*' แทนที่จะเป็นที่สิ้นสุด ฉันจะทำสิ่งนี้ได้อย่างไร
53 xargs 

3
sshfs เมา sudo ได้รับอนุญาตถูกปฏิเสธ
ฉันกำลังใช้sshfsเพื่อติดตั้งโฟลเดอร์ที่มีโครงการหลามมากกว่า ssh ไปยัง~/ไดเรกทอรีของฉัน $ mkdir -p ~/mount/my-projects $ sshfs user@example.com:/home/user/my-projects ~/mount/my-projects ฉันสามารถดำเนินการคำสั่งส่วนใหญ่ตามที่คาดไว้: $ ls ~/mount/my-projects some-python-project แต่ฉันถ้าฉันพยายามทำอะไรกับsudoมันมันก็ล้มเหลวโดยไม่ได้รับอนุญาต: $ sudo ls ~/mount/my-projects ls: cannot access /home/user/mount/my-projects: Permission denied สิ่งที่ฉันพยายามทำให้สำเร็จคือการทดสอบสคริปต์การติดตั้งแพคเกจหลามบนเครื่องของฉัน: $ cd ~/mount/my-projects/some-python-project $ sudo python setup.py install
53 ssh  sudo  sshfs 

3
ฉันจะบอกได้อย่างไรว่าฉันอยู่ในเซสชั่น tmux จากสคริปต์ทุบตี?
ฉันชอบที่จะเก็บไว้bash_profileในที่เก็บคอมไพล์และโคลนมันกับเครื่องที่ฉันเข้าถึงเชลล์ได้ เนื่องจากฉันtmuxใช้เวลาส่วนใหญ่ฉันมีuser@hostสตริงในบรรทัดสถานะแทนที่จะเป็นจุดดั้งเดิมในเชลล์พรอมต์ มีบางเว็บไซต์ที่ฉันใช้tmuxติดตั้งไว้หรือฉันอาจไม่ได้ใช้งาน ฉันต้องการตรวจสอบเมื่อฉันไม่ได้อยู่ในtmuxเซสชั่นและปรับพรอมต์ของฉันตาม จนถึงตอนนี้วิธีการแก้ปัญหาของฉันที่อบในตอนนี้.bash_profileดูเหมือนว่า _display_host_unless_in_tmux_session() { # ??? } export PROMPT_COMMAND='PS1=$(_display_host_unless_in_tmux_session)${REST_OF_PROMPT}' (การตรวจสอบทุกครั้งอาจไม่ใช่วิธีที่ดีที่สุดดังนั้นฉันจึงเปิดรับข้อเสนอแนะสำหรับวิธีที่ดีกว่าในการทำเช่นนี้การสคริปต์ Bash ไม่ใช่มือขวาของฉัน)
53 bash  prompt  tmux 

6
ค้นหาข้อความทั่วทั้งระบบไฟล์ได้อย่างไร?
สมมติว่าควรใช้เครื่องมือ grep ฉันต้องการค้นหาสตริงข้อความ "800x600" ตลอดทั้งระบบไฟล์ ฉันเหนื่อย: grep -r 800x600 / แต่มันไม่ทำงาน สิ่งที่ฉันเชื่อว่าคำสั่งของฉันควรทำคือ grep วนซ้ำผ่านไฟล์ / โฟลเดอร์ทั้งหมดภายใต้รูทสำหรับข้อความ "800x600" และแสดงรายการผลการค้นหา ผมทำอะไรผิดหรือเปล่า?
53 grep  recursive 

9
เหตุใดจึงต้องใส่สิ่งอื่นนอกเหนือจาก / home ในพาร์ติชันแยก
ดังนั้นเมื่อเร็ว ๆ นี้ Debian 5.0.5 การติดตั้งให้ฉันที่จะมีการแยกต่างหาก/usr, /home, /varและ/tmpพาร์ทิชัน (บนดิสก์ทางหนึ่ง) อะไรคือเหตุผลในทางปฏิบัติสำหรับสิ่งนี้ ฉันเข้าใจว่า/homeสามารถวางพาร์ติชันแยกต่างหากได้เนื่องจากไฟล์ผู้ใช้สามารถเข้ารหัสแยกต่างหาก แต่ทำไมต้องทำอย่างอื่น
53 linux  partition 

2
การแทนที่ตัวแปรเฉพาะด้วย envsubst
ฉันพยายามเปลี่ยนตัวแปรสภาพแวดล้อมผ่านenvsubstแต่ฉันต้องการแทนที่ตัวแปรเฉพาะเท่านั้น จากเอกสารฉันควรบอกenvsubstให้เปลี่ยนเฉพาะตัวแปรบางตัวเท่านั้น แต่ฉันไม่สามารถทำเช่นนั้นได้ ตัวอย่างเช่นถ้าฉันมีไฟล์ที่มี: VAR_1=${VAR_1} VAR_2=${VAR_2} ฉันจะดำเนินการอย่างไรenvsubstเพื่อที่จะแทนที่การอ้างอิงถึง${VAR_1}เท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.