คำถามติดแท็ก bash

คำถามเฉพาะของ Bourne อีกครั้งของเชลล์ใน GNU เมื่อเทียบกับเชลล์ Bourne / POSIX อื่น ๆ สำหรับคำถามเกี่ยวกับเชลล์ Unix โดยทั่วไปให้ใช้ / เชลล์แท็กแทน

2
วิธีที่เร็วที่สุดในการเชื่อมไฟล์เข้าด้วยกัน
ฉันมีไฟล์ 10k + รวมกว่า 20GB ที่ฉันต้องต่อกันเป็นไฟล์เดียว มีวิธีที่เร็วกว่า cat input_file* >> out ? วิธีที่ต้องการจะเป็นคำสั่ง bash, Python เป็นที่ยอมรับเช่นกันหากไม่ช้ากว่านี้มาก
25 bash  shell-script  files  cat 

5
ชื่อสีขั้ว "เป็นมิตร" ในเชลล์สคริปต์?
ฉันรับรู้ถึงห้องสมุดในภาษาต่างๆเช่น Ruby และ Javascript เพื่อทำให้ colorizing script terminal ของคุณง่ายขึ้นโดยใช้ชื่อสีเช่น "red" แต่มีบางอย่างเช่นนี้สำหรับเชลล์สคริปต์ใน Bash หรือ Ksh หรืออะไรก็ตาม?

2
Bash scripting - loop จนกว่าค่าที่ส่งคืนจะเป็น 0
ฉันจำเป็นต้องติดตั้งบางสิ่งบางอย่างในสคริปต์ของฉัน แต่บางครั้งก็ยกเลิกการต่อเชื่อมก่อนที่ข้อมูลทั้งหมดจะถูกคัดลอกและทำให้การติดตั้งล้มเหลว ฉันมองหาวิธีที่จะทำการติดตั้ง "บล็อก" แต่ฉันไม่พบอะไรเลย ดังนั้นฉันพยายามเขียนสคริปต์เพื่อวนซ้ำจนกว่าจะสามารถ unmount ได้ แต่ไม่ได้ผล while [ `sudo umount mount` ] do sleep 0.1 done rmdir mount เมื่อรันเอาต์พุต: umount: /home/evantandersen/mount: device is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) rmdir: failed to remove `mount': Device …

10
วิธีลบบรรทัดใหม่หลายรายการที่ EOF
ฉันมีไฟล์ที่ลงท้ายด้วยการขึ้นบรรทัดใหม่อย่างน้อยหนึ่งบรรทัดและควรลงท้ายด้วยการขึ้นบรรทัดใหม่เพียงครั้งเดียว ฉันจะทำสิ่งนั้นด้วยเครื่องมือ Bash / Unix / GNU ได้อย่างไร ตัวอย่างไฟล์ที่ไม่ดี: 1\n \n 2\n \n \n 3\n \n \n \n ตัวอย่างไฟล์ที่แก้ไข: 1\n \n 2\n \n \n 3\n กล่าวอีกนัยหนึ่ง: ควรมีการขึ้นบรรทัดใหม่หนึ่งบรรทัดระหว่าง EOF และอักขระที่ไม่ใช่บรรทัดใหม่ล่าสุดของไฟล์ การดำเนินการอ้างอิง อ่านเนื้อหาไฟล์ตัดบรรทัดใหม่หนึ่งบรรทัดจนไม่มีบรรทัดใหม่อีกสองบรรทัดในตอนท้ายเขียนมันกลับมา: #! /bin/python import sys with open(sys.argv[1]) as infile: lines = infile.read() while lines.endswith("\n\n"): lines = lines[:-1] with open(sys.argv[2], 'w') …
25 bash  sed  awk  ed 

6
การเพิ่มข้อความไปยังชื่อไฟล์ก่อนที่จะขยาย
ฉันต้องการที่จะเพิ่มข้อความในตอนท้ายของชื่อไฟล์ แต่ก่อนที่จะขยาย ตอนนี้ฉันกำลังพยายาม for f in *.shp; do echo $f_poly; done ผลลัพธ์คือ Quercus_acutifolia.shp_poly Quercus_agrifolia.shp_poly Quercus_corrugata.shp_poly Quercus_cortesii.shp_poly Quercus_costaricensis.shp_poly Quercus_havardii.shp_poly Quercus_hemisphaerica.shp_poly Quercus_kelloggii.shp_poly Quercus_knoblochii.shp_poly Quercus_laceyi.shp_poly ฉันอยากให้มันเป็น Quercus_acutifolia_poly.shp Quercus_agrifolia_poly.shp Quercus_corrugata_poly.shp Quercus_cortesii_poly.shp Quercus_costaricensis_poly.shp Quercus_havardii_poly.shp Quercus_hemisphaerica_poly.shp Quercus_kelloggii_poly.shp Quercus_knoblochii_poly.shp Quercus_laceyi_poly.shp
25 bash  rename  filenames 

2
วิธีออกจากโหมดค้นหาประวัติทุบตี
ใน Ubuntu 12.04 ฉันใช้CTRL- Rเพื่อเข้าสู่การค้นหาประวัติย้อนกลับ หากไม่พบคำสั่งที่ฉันต้องการ (หลังจากทำซ้ำCTRL- R) ฉันจะออกจากทันทีไปยังพรอมต์คำสั่ง (ว่าง) โดยไม่มีคำสั่งประวัติป้อนหรือดำเนินการในบรรทัดคำสั่งได้อย่างไร

1
นามแฝงคำสั่งให้ทำงานในพื้นหลัง
ฉันต้องการแป้นพิมพ์ลัดเพื่อทำงานดังนี้: > e foo.txt เพื่อขยายเป็น > emacs foo.txt & ใช้ง่ายalias e=emacsแต่ฉันจะแทรก&ชื่อไฟล์หลังได้อย่างไร ฉันรู้ว่ามันอาจเป็นไปไม่ได้ที่จะใช้เพียงอย่างเดียวaliasดังนั้นฉันจะยอมรับโซลูชันทุบตีใด ๆ หากจำเป็นต้องใช้เชลล์สคริปต์โปรดอธิบายวิธีการทำงาน
25 bash  alias 

6
ฉันจะเปิดเทอร์มินัลใหม่ในไดเรกทอรีเดียวกันของสิ่งที่ใช้ล่าสุดจาก keybind จัดการหน้าต่างได้อย่างไร
ฉันใช้ตัวจัดการหน้าต่างเรียงต่อกันและฉันเปลี่ยนจากgnome-terminalแท็บหลายแท็บเป็นหลายurxvtอินสแตนซ์ที่จัดการโดยตัวจัดการหน้าต่าง หนึ่งในคุณสมบัติที่ฉันพลาดคือความสามารถในการเปิดเทอร์มินัลใหม่ซึ่งเป็นค่าเริ่มต้นไปยังไดเรกทอรีการทำงานของอันสุดท้าย กล่าวโดยย่อ: ฉันต้องการวิธีในการเปิด urxvt ใหม่ (ทุบตี) ที่เป็นค่าเริ่มต้นที่ $ PWD ของรายการที่ใช้ล่าสุด ทางออกเดียวที่อยู่ในใจของฉันคือการบันทึกเส้นทางปัจจุบันในทุก ๆcdสิ่ง: echo $PWD > ~/.last_dir และกู้คืนพา ธ บนเทอร์มินัลใหม่ด้วยวิธีนี้: cd `cat ~/.last_dir` ฉันสามารถสั่งคำสั่งที่สองได้.bashrcแต่ฉันไม่รู้วิธีเรียกใช้คำสั่งแรกในทุกการเปลี่ยนแปลงของไดเรกทอรี :) ยินดีต้อนรับทางออกที่ง่ายกว่าที่ไม่เกี่ยวข้องscreenหรือtmuxการใช้งาน

6
มีวิธีตั้งค่าขนาดของรายการประวัติเป็น bash มากกว่า 5,000 บรรทัดหรือไม่?
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Unix & Linux Stack Exchange อพยพ 8 ปีที่ผ่านมา ไม่ว่าฉันจะตั้งค่าHISTSIZEตัวแปรสภาพแวดล้อมให้ใหญ่กว่า 5,000 เท่าไหร่เมื่อพิมพ์รายการประวัติด้วยhistorybuiltin มันจะพิมพ์เฉพาะคำสั่ง 5000 ล่าสุดเท่านั้น ฉันต้องการสิ่งนั้นเพราะฉันมักจะมีขนาดใหญ่.bash_historyซึ่งเกิน 5,000 บรรทัดและบางครั้งหนึ่งต้องระบุคำสั่งก่อนหน้าโดยกดCtrl-Rแต่ถ้าคำสั่งนั้นมากกว่า 5,000 คำสั่งก่อนหน้าฉันไม่สามารถเข้าถึงได้โดยใช้กลไกนั้น ฉันรู้ว่าฉันสามารถใช้grepบน.bash_historyแต่ผมคิดว่าCtrl-Rกลไกที่จะมากขึ้นเร็วขึ้น (และสะดวก) ฉันใช้ gnu bash เวอร์ชั่น 4.1 นั่นคือเนื้อหาทั้งหมดของไฟล์. bashrc ของฉัน: #!/bin/bash # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # …
25 linux  bash  shell 

7
วิธีตรวจสอบว่า $ PWD เป็นไดเรกทอรีย่อยของเส้นทางที่กำหนดหรือไม่
เช่นตรวจสอบว่า$PWDเป็นไดเรกทอรีย่อยของ / home ในคำอื่น ๆ ที่ฉันกำลังค้นหาการดำเนินการสตริงทุบตีเพื่อตรวจสอบว่าหนึ่งสตริงเริ่มต้นด้วยอีก
25 bash  shell  directory  string 

2
วิธีการแทรกตัวแปรภายในสตริงที่มี“”?
ฉันต้องการสร้างสตริง xml โดยการแทรกตัวแปร: str1="Hello" str2="world" xml='<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>' echo $xml ผลลัพธ์ที่ควรจะเป็น <?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2> แต่สิ่งที่ฉันได้คือ: <?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2> ฉันก็ลอง xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>" แต่จะลบเครื่องหมายคำพูดคู่ด้านในและให้ <?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>
25 bash  shell  variable  xml 

3
เมื่อฉันใช้ zip ฉันจะแสดงความคืบหน้าโดยรวมได้อย่างไรโดยไม่ทำให้บรรทัดคำสั่งท่วมท้น?
แถบความคืบหน้าที่มีความยาวคงที่จำนวนไฟล์หรือไบต์หรือดีกว่า แต่ตัวจับเวลาที่แสดงเวลาที่เหลือโดยประมาณนั้นจะเหมาะสมที่สุด zipพฤติกรรมมาตรฐานของดูเหมือนจะพิมพ์บรรทัดสำหรับทุกไฟล์ที่ประมวลผล แต่ฉันไม่ต้องการให้ข้อมูลมากเกินไปเมื่อฉันซิปไฟล์หลายพันไฟล์ ฉันต้องการเดาว่ามันจะใช้เวลานานแค่ไหน ฉันลองใช้ตัวเลือก-q( --quiet) ร่วมกับ-dg( --display-globaldots) แต่นั่นก็ทำให้ stdout เต็มไปด้วยจุดหลายบรรทัดและไม่แสดงสิ่งที่มีประโยชน์ ฉันพยายาม-qdgds 10mตามที่กล่าวไว้ในหน้า man แต่ได้ผลลัพธ์เดียวกัน ฉันลองแล้ว-db( --display-bytes) และ-dc( --display-counts) แต่ดูเหมือนจะไม่มีตัวเลือกระดับโลกดังนั้นจึงพิมพ์ใหม่สำหรับชื่อไฟล์ทุกชื่อ สุดท้ายฉันพยายามมันด้วยกัน-qเหมือน-qdbdcแต่เพียงว่าไม่มีอะไรที่เอาท์พุท สนุกพอฉันพบหน้าคนในเว็บไซต์ info-zip ที่กล่าวถึงตัวเลือก-de( --display-est-to-go) ซึ่งควรจะ "แสดงเวลาโดยประมาณเพื่อให้การดำเนินการเก็บถาวรเสร็จสิ้น" ฟังดูเหมือนสิ่งที่ฉันต้องการ แต่ปัญหาคือเวอร์ชั่นของฉันzipไม่มีคุณสมบัตินั้น ฉันใช้ Ubuntu 14.04.1 64 บิต, bash-4.3.30 (1) และ zip-3.00 ตาม Wikipedia นี่เป็นรุ่นล่าสุดที่เสถียรของ zip มีรุ่นเบต้าที่ยังไม่เผยแพร่ในหน้าแหล่งข้อมูล info-zip แต่ฉันไม่อยากมอบข้อมูลของฉันให้เป็นรุ่นเบต้า

5
แนะนำให้ใช้ zsh แทนที่จะเป็นสคริปต์ทุบตีหรือไม่? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิด4 วันที่ผ่านมา ฉันสามารถสันนิษฐานได้ว่ามีคนจำนวนมากพอที่จะzshติดตั้งเพื่อรันสคริปต์ด้วย #!/usr/bin/env zsh ในฐานะ shebang? หรือสิ่งนี้จะทำให้สคริปต์ของฉันไม่สามารถทำงานได้บนระบบมากเกินไปหรือไม่ ชี้แจง: ฉันสนใจโปรแกรม / สคริปต์ที่ผู้ใช้อาจต้องการเรียกใช้ (เช่นบน Ubuntu, Debian, SUSE, Arch & c.)

5
ฉันจะใช้วิธีทุบตีถ้าทดสอบและค้นหาคำสั่งด้วยกันได้อย่างไร
ฉันมีไดเรกทอรีที่มีบันทึกข้อผิดพลาดและฉันต้องการใช้คำสั่งแบบมีเงื่อนไขในสคริปต์ทุบตีตามคำสั่งค้นหา ไฟล์บันทึกจะถูกจัดเก็บในรูปแบบนี้: /var/log/crashes/app-2012-08-28.log /var/log/crashes/otherapp-2012-08-28.log ฉันต้องการให้คำสั่ง if ส่งคืนจริงถ้ามีบันทึกการทำงานล้มเหลวสำหรับแอปเฉพาะซึ่งได้รับการแก้ไขใน 5 นาทีที่ผ่าน findคำสั่งที่ผมจะใช้เป็น: find /var/log/crashes -name app-\*\.log -mmin -5 ฉันไม่แน่ใจว่าจะรวมเข้ากับifคำสั่งได้อย่างถูกต้อง ฉันคิดว่านี่อาจใช้งานได้: if [ test `find /var/log/crashes -name app-\*\.log -mmin -5` ] then service myapp restart fi มีบางพื้นที่ที่ฉันไม่ชัดเจน: ฉันดูที่ธง ifแต่ฉันไม่แน่ใจว่าควรใช้อันไหนถ้ามี ฉันต้องการtestคำสั่งหรือฉันควรประมวลผลผลลัพธ์ของคำสั่ง find โดยตรงหรืออาจใช้find... | wc -lเพื่อรับจำนวนบรรทัดแทน ไม่จำเป็น 100% ที่จะตอบคำถามนี้ แต่testสำหรับการทดสอบกับโค้ดส่งคืนที่คำสั่งส่งคืน? และพวกมันมองไม่เห็น - ด้านนอกของstdout/ stderr? …

2
ใช้สคริปต์ด้วย“ "และกับ" แหล่งที่มา "
ฉันสงสัยว่าสองวิธีต่อไปนี้ในการใช้งานสคริปต์ทุบตีนั้นเทียบเท่าหรือไม่ . ./myScript.sh source myScript.sh พวกเขาทั้งสองกำลังเรียกใช้เนื้อหาของสคริปต์แทนที่จะเรียกใช้สคริปต์เช่นไม่สร้าง subshell สำหรับเรียกใช้สคริปต์หรือไม่

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